public interface IExpressionEvaluator extends ICookable, IMultiCookable
The syntax of the expression to compile is that of a Java expression, as defined in JLS7, section 15. Notice that a Java expression does not have a concluding semicolon.
Example:
a + 7 * b
(Notice that this expression refers to two parameters "a" and "b", as explained below.)
The expression may optionally be preceeded with a sequence of import directives like
import java.text.*;
new DecimalFormat("####,###.##").format(10200020.345345)
(Notice that the import directive is concluded with a semicolon, while the expression is not.) This feature is not available if you compile many expressions at a time (see below).
To set up an IExpressionEvaluator object, proceed as follows:
IExpressionEvaluator-derived classIExpressionEvaluator by calling any of the following methods:setExpressionType(Class)
setParameters(String[], Class[])
setThrownExceptions(Class[])
setParentClassLoader(ClassLoader)
setDefaultImports(String[])
ICookable.cook(String, java.io.Reader) methods to scan, parse, compile and load the expression
into the JVM.
After the IExpressionEvaluator object is set up, the expression can be evaluated as often with different
parameter values (see evaluate(Object[])). This evaluation is very fast, compared to the compilation.
Less common methods exist that allow for the specification of the name of the generated class, the class it
extends, the interfaces it implements, the name of the method that executes the expression, the exceptions that
this method (i.e. the expression) is allowed to throw, and the ClassLoader that is used to define the
generated class and to load classes referenced by the expression.
If you want to compile many expressions at the same time, you have the option to cook an array of
expressions in one IExpressionEvaluator by using the following methods:
setMethodNames(String[])
setParameters(String[][], Class[][])
setExpressionTypes(Class[])
setStaticMethod(boolean[])
setThrownExceptions(Class[][])
IMultiCookable.cook(String[], Reader[])
evaluate(int, Object[])
Notice that these methods have array parameters in contrast to their one-expression brethren.
Notice that for functionally identical IExpressionEvaluators, Object.equals(java.lang.Object) will return true. E.g. "a+b" and "c + d" are functionally
identical if "a" and "c" have the same type, and so do "b" and "d".
'JLS7' refers to the Java Language Specification, Java SE 7 Edition.
| Modifier and Type | Field and Description |
|---|---|
static Class<?> |
ANY_TYPE
Deprecated.
Since autoboxing was introduced in JANINO, this feature is no longer necessary because you can use
expression type
Object.class |
static String |
DEFAULT_CLASS_NAME
The fully qualified name of the generated class, iff not reconfigured by
setClassName(String). |
static Class<?> |
DEFAULT_EXPRESSION_TYPE
The type of all expressions that were not reconfigured with
setExpressionTypes(Class[]). |
| Modifier and Type | Method and Description |
|---|---|
<T> T |
createFastEvaluator(Reader reader,
Class<? extends T> interfaceToImplement,
String... parameterNames) |
<T> T |
createFastEvaluator(String expression,
Class<? extends T> interfaceToImplement,
String... parameterNames)
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[]). |
Object |
evaluate(int idx,
Object... arguments)
Null arguments is equivalent with new Object[0]. |
Object |
evaluate(Object... arguments)
Evaluates the expression with concrete parameter values.
|
Class<?> |
getClazz() |
Class<?> |
getDefaultExpressionType() |
String[] |
getDefaultImports() |
Method |
getMethod() |
Method |
getMethod(int idx) |
Method[] |
getResult() |
void |
setClassName(String className) |
void |
setCompileErrorHandler(ErrorHandler compileErrorHandler)
Installs an
ErrorHandler which is invoked during compilation on each error. |
void |
setDebuggingInformation(boolean debugSource,
boolean debugLines,
boolean debugVars)
Determines what kind of debugging information is included in the generates classes.
|
void |
setDefaultExpressionType(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 |
void |
setDefaultImports(String... defaultImports) |
void |
setExpressionType(Class<?> expressionType)
Defines the type of the expression.
|
void |
setExpressionTypes(Class<?>[] expressionTypes)
Configures the types of the expressions.
|
void |
setExtendedClass(Class<?> extendedType) |
void |
setImplementedInterfaces(Class<?>[] implementedTypes)
Configures the interfaces that the generated class implements.
|
void |
setMethodName(String methodName) |
void |
setMethodNames(String[] methodNames) |
void |
setOverrideMethod(boolean overrideMethod) |
void |
setOverrideMethod(boolean[] overrideMethod) |
void |
setParameters(String[][] parameterNames,
Class<?>[][] parameterTypes) |
void |
setParameters(String[] parameterNames,
Class<?>[] parameterTypes) |
void |
setParentClassLoader(ClassLoader parentClassLoader)
The "parent class loader" is used to load referenced classes.
|
void |
setReturnType(Class<?> returnType)
Deprecated.
Use
setExpressionType(Class) instead |
void |
setStaticMethod(boolean staticMethod) |
void |
setStaticMethod(boolean[] staticMethod) |
void |
setThrownExceptions(Class<?>[] thrownExceptions) |
void |
setThrownExceptions(Class<?>[][] thrownExceptions) |
void |
setWarningHandler(WarningHandler warningHandler)
By default, warnings are discarded, but an application my install a custom
WarningHandler. |
static final String DEFAULT_CLASS_NAME
setClassName(String).static final Class<?> DEFAULT_EXPRESSION_TYPE
setExpressionTypes(Class[]).@Deprecated static final Class<?> ANY_TYPE
Object.classsetExpressionType(Class) that indicates that the expression may have any type.void setParentClassLoader(@Nullable ClassLoader parentClassLoader)
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.
void setDebuggingInformation(boolean debugSource,
boolean debugLines,
boolean debugVars)
-g:none".void setCompileErrorHandler(@Nullable ErrorHandler compileErrorHandler)
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.
compileErrorHandler - null to restore the default behavior (throwing a CompileException)void setWarningHandler(@Nullable WarningHandler warningHandler)
WarningHandler.warningHandler - null to indicate that no warnings be issued@Nullable Object evaluate(@Nullable Object... arguments) throws InvocationTargetException
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].
arguments - The actual parameter valuesInvocationTargetExceptionvoid setDefaultExpressionType(Class<?> defaultExpressionType)
IExpressionEvaluator, the "default expression type" is used for the expressionClass<?> getDefaultExpressionType()
setDefaultExpressionType(Class)void setImplementedInterfaces(Class<?>[] implementedTypes)
@Deprecated void setReturnType(@Deprecated Class<?> returnType)
setExpressionType(Class) insteadvoid setExpressionType(Class<?> expressionType)
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.
void setExpressionTypes(Class<?>[] expressionTypes)
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.
void setOverrideMethod(boolean overrideMethod)
void setOverrideMethod(boolean[] overrideMethod)
void setClassName(String className)
IClassBodyEvaluator.setClassName(String)void setExtendedClass(Class<?> extendedType)
void setDefaultImports(String... defaultImports)
String[] getDefaultImports()
IClassBodyEvaluator.getDefaultImports()void setStaticMethod(boolean staticMethod)
void setStaticMethod(boolean[] staticMethod)
void setMethodName(String methodName)
IScriptEvaluator.setMethodName(String)void setMethodNames(String[] methodNames)
void setThrownExceptions(Class<?>[] thrownExceptions)
void setThrownExceptions(Class<?>[][] thrownExceptions)
@Nullable Object evaluate(int idx, @Nullable Object... arguments) throws InvocationTargetException
Null arguments is equivalent with new Object[0].InvocationTargetException<T> T createFastEvaluator(String expression, Class<? extends T> interfaceToImplement, String... parameterNames) throws CompileException
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).
CompileException<T> T createFastEvaluator(Reader reader, Class<? extends T> interfaceToImplement, String... parameterNames) throws CompileException, IOException
CompileExceptionIOExceptioncreateFastEvaluator(String, Class, String[])Method getMethod()
IScriptEvaluator.getMethod()Method getMethod(int idx)
IScriptEvaluator.getMethod(int)Class<?> getClazz()
IClassBodyEvaluator.getClazz()Method[] getResult()
IScriptEvaluator.getResult()Copyright © 2022. All rights reserved.