Interface IExpressionEvaluator

    • Field Detail

      • DEFAULT_EXPRESSION_TYPE

        static final java.lang.Class<?> DEFAULT_EXPRESSION_TYPE
        The type of all expressions that were not reconfigured with setExpressionTypes(Class[]).
      • ANY_TYPE

        @Deprecated
        static final java.lang.Class<?> ANY_TYPE
        Deprecated.
        Since autoboxing was introduced in JANINO, this feature is no longer necessary because you can use expression type Object.class
        Special value for setExpressionType(Class) that indicates that the expression may have any type.
    • Method Detail

      • setParentClassLoader

        void setParentClassLoader​(@Nullable
                                  java.lang.ClassLoader parentClassLoader)
        The "parent class loader" is used to load referenced classes. Useful values are:
        System.getSystemClassLoader() The running JVM's class path
        Thread.currentThread().getContextClassLoader() or null The class loader effective for the invoking thread
        ClassLoaders.BOOTCLASSPATH_CLASS_LOADER The running JVM's boot class path

        The parent class loader defaults to the current thread's context class loader.

      • setDebuggingInformation

        void setDebuggingInformation​(boolean debugSource,
                                     boolean debugLines,
                                     boolean debugVars)
        Determines what kind of debugging information is included in the generates classes. The default is typically "-g:none".
      • setCompileErrorHandler

        void setCompileErrorHandler​(@Nullable
                                    ErrorHandler compileErrorHandler)
        Installs an ErrorHandler which is invoked during compilation on each error. (By default, the compilation throws a CompileException on the first error and terminates.)

        If the given ErrorHandler throws a CompileException, then the compilation terminates and the exception is propagated.

        If the given ErrorHandler does not throw a CompileException but completes normally, then the compilation may or may not continue, depending on the error. Iff the compilation completes normally but errors were reported, then it will throw a CompileException indicating the number of errors.

        In other words: The ErrorHandler may throw a CompileException or not, but the compilation will definitely throw a CompileException if one or more compile errors have occurred.

        Parameters:
        compileErrorHandler - null to restore the default behavior (throwing a CompileException)
      • setWarningHandler

        void setWarningHandler​(@Nullable
                               WarningHandler warningHandler)
        By default, warnings are discarded, but an application my install a custom WarningHandler.
        Parameters:
        warningHandler - null to indicate that no warnings be issued
      • evaluate

        @Nullable
        java.lang.Object evaluate()
                           throws java.lang.reflect.InvocationTargetException
        Shorthand for evaluate(new Object[0]).
        Throws:
        java.lang.reflect.InvocationTargetException
      • evaluate

        @Nullable
        java.lang.Object evaluate​(@Nullable
                                  java.lang.Object[] arguments)
                           throws java.lang.reflect.InvocationTargetException
        Evaluates the expression with concrete parameter values.

        Each argument value must have the same type as specified through the "parameterTypes" parameter of setParameters(String[], Class[]).

        Arguments of primitive type must passed with their wrapper class objects.

        The object returned has the class as specified through setExpressionType(Class).

        This method is thread-safe.

        Null arguments is equivalent with new Object[0].

        Notice: In version 3.1.8, the arguments parameter was changed from Object[] to Object..., which turned out to be a really bad decision because it caused a very ugly invocation ambiguity with evaluate(int, Object[]). Thus, with version 3.1.10, the parameter was changed back to Object[].

        Parameters:
        arguments - The actual parameter values
        Throws:
        java.lang.reflect.InvocationTargetException
      • setDefaultExpressionType

        void setDefaultExpressionType​(java.lang.Class<?> defaultExpressionType)
        Reconfigures the "default expression type"; if no expression type is configured for an expression, then, when cooking this IExpressionEvaluator, the "default expression type" is used for the expression
      • getDefaultExpressionType

        java.lang.Class<?> getDefaultExpressionType()
        Returns:
        The currently configured "default expression type"
        See Also:
        setDefaultExpressionType(Class)
      • setImplementedInterfaces

        void setImplementedInterfaces​(java.lang.Class<?>[] implementedTypes)
        Configures the interfaces that the generated class implements.
      • setReturnType

        @Deprecated
        void setReturnType​(@Deprecated
                           java.lang.Class<?> returnType)
        Deprecated.
      • setExpressionType

        void setExpressionType​(java.lang.Class<?> expressionType)
        Defines the type of the expression.

        Defaults to Object.class, which, thanks to autoboxing, allows for any expression type (including primitive types).

        If expressionType is void.class, then the expression must be an invocation of a void method.

      • setExpressionTypes

        void setExpressionTypes​(java.lang.Class<?>[] expressionTypes)
        Configures the types of the expressions.

        Unless this method is called, all expressions have type Object.class.

        If any expression has type void.class, then it must be an invocation of a void method.

      • setOverrideMethod

        void setOverrideMethod​(boolean overrideMethod)
        Defines whether the generated method overrides a methods declared in a supertype.
      • setOverrideMethod

        void setOverrideMethod​(boolean[] overrideMethod)
        Same as setOverrideMethod(boolean), but for multiple expressions.
      • setParameters

        void setParameters​(java.lang.String[] parameterNames,
                           java.lang.Class<?>[] parameterTypes)
        Defines the names and types of the parameters of the generated method.

        names.length and types.length must be equal. This invariant may be checked immediately, or later when the expression is cooked.

        The parameters can be of primitive type, e.g. double.class.

        The default is to have zero parameters.

      • setParameters

        void setParameters​(java.lang.String[][] parameterNames,
                           java.lang.Class<?>[][] parameterTypes)
        Same as setParameters(String[], Class[]), but for multiple expressions.
      • setClassName

        void setClassName​(java.lang.String className)
        Sets the name of the generated class. Defaults to DEFAULT_CLASS_NAME. In most cases, there is no need to set this name, because the generated class is loaded into its own ClassLoader where its name cannot collide with classes generated by other evaluators.

        One reason to use this function is to have a class name in a non-default package, which can be relevant when types and members with DEFAULT accessibility are accessed.

      • setExtendedClass

        void setExtendedClass​(java.lang.Class<?> extendedType)
        Sets a particular superclass that the generated class will extend. If extendedClass is null, the generated class will extend Object.

        The usual reason to set a base class for an evaluator is that the generated class can directly access the superclass's (non-private) members.

      • setDefaultImports

        void setDefaultImports​(java.lang.String... defaultImports)
        "Default imports" add to the system import "java.lang", i.e. the evaluator may refer to classes imported by default imports without having to explicitly declare IMPORT statements.

        Notice that JDK 5 "static imports" are also supported, as shown here:

             sc.setDefaultImports(
                 "java.util.Map",                          // Single type import
                 "java.io.*",                              // Type-import-on-demand
                 "static java.util.Collections.EMPTY_MAP", // Single static import
                 "static java.util.Collections.*",         // Static-import-on-demand
             );
      • getDefaultImports

        java.lang.String[] getDefaultImports()
        Returns:
        The default imports that were previously configured with setDefaultImports(String...)
      • setStaticMethod

        void setStaticMethod​(boolean staticMethod)
        Defines whether the generated method should be STATIC or not. Defaults to true.
      • setStaticMethod

        void setStaticMethod​(boolean[] staticMethod)
        Same as setStaticMethod(boolean), but for multiple expressions.
      • setMethodName

        void setMethodName​(java.lang.String methodName)
        Defines the name of the generated method. Initially, the method name is "eval*".
        Parameters:
        methodName - null means reset to default name
        See Also:
        IScriptEvaluator.DEFAULT_METHOD_NAME
      • setMethodNames

        void setMethodNames​(java.lang.String[] methodNames)
        Same as setMethodName(String), but for multiple expressions.

        Define the names of the generated methods. By default the methods have distinct and implementation-specific names.

        If two expressions have the same name, then they must have different parameter types (see setParameters(String[][], Class[][])).

      • setThrownExceptions

        void setThrownExceptions​(java.lang.Class<?>[] thrownExceptions)
        Defines the exceptions that the generated method may throw.
      • setThrownExceptions

        void setThrownExceptions​(java.lang.Class<?>[][] thrownExceptions)
        Same as setThrownExceptions(Class[]), but for multiple expressions.
      • evaluate

        @Nullable
        java.lang.Object evaluate​(int idx,
                                  @Nullable
                                  java.lang.Object[] arguments)
                           throws java.lang.reflect.InvocationTargetException
        Same as evaluate(Object[]), but for multiple expressions.

        Notice: In version 3.1.8, the arguments parameter was changed from Object[] to Object..., which turned out to be a really bad decision because it caused a very ugly invocation ambiguity with evaluate(int, Object[]). Thus, with version 3.1.10, the parameter was changed back to Object[].

        Throws:
        java.lang.reflect.InvocationTargetException
      • createFastEvaluator

        <T> T createFastEvaluator​(java.lang.String expression,
                                  java.lang.Class<? extends T> interfaceToImplement,
                                  java.lang.String... parameterNames)
                           throws CompileException
        If the parameter and return types of the expression are known at compile time, then a "fast" expression evaluator can be instantiated through createFastEvaluator(String, Class, String[]). Expression evaluation is faster than through evaluate(Object[]), because it is not done through reflection but through direct method invocation.

        Example:

         public interface Foo {
             int bar(int a, int b);
         }
         ...
         ExpressionEvaluator ee = CompilerFactoryFactory.getDefaultCompilerFactory().newExpressionEvaluator();
        
         // Optionally configure the EE here...
         ee.setClassName("Bar");
         ee.setDefaultImports(new String[] { "java.util.*" });
         ee.setExtendedClass(SomeOtherClass.class);
         ee.setParentClassLoader(someClassLoader);
        
         // Optionally configure the EE here...
         Foo f = (Foo) ee.createFastEvaluator(
             "a + b",                    // expression to evaluate
             Foo.class,                  // interface that describes the expression's signature
             new String[] { "a", "b" }   // the parameters' names
         );
         System.out.println("1 + 2 = " + f.bar(1, 2)); // Evaluate the expression
         

        All other configuration (implemented type, static method, return type, method name, parameter names and types, thrown exceptions) are predetermined by the interfaceToImplement.

        Notice: The interfaceToImplement must be accessible by the compiled class, i.e. either be declared public, or with protected or default access in the package of the compiled class (see setClassName(String).

        Throws:
        CompileException
      • getMethod

        java.lang.reflect.Method getMethod()
        Returns:
        The generated and loaded Method
        Throws:
        java.lang.IllegalStateException - This IExpressionEvaluator is not yet cooked
      • getMethod

        java.lang.reflect.Method getMethod​(int idx)
        Same as getMethod(), but for multiple expressions.
      • getClazz

        java.lang.Class<?> getClazz()
        Returns:
        The generated Class
        Throws:
        java.lang.IllegalStateException - This IClassBodyEvaluator is not yet cooked
      • getResult

        java.lang.reflect.Method[] getResult()
        Returns:
        The generated and loaded methods that implement the cooked expressions
        Throws:
        java.lang.IllegalStateException - This IScriptEvaluator is not yet cooked