public class ExpressionEvaluator extends ScriptEvaluator implements IExpressionEvaluator
IExpressionEvaluator is implemented by creating and compiling a temporary compilation unit defining one
class with one static method with one RETURN statement.
A number of "convenience constructors" exist that execute the set-up steps described for IExpressionEvaluator instantly.
If the parameter and return types of the expression are known at compile time, then a "fast" expression evaluator
can be instantiated through ScriptEvaluator.createFastEvaluator(String, Class, String[]). Expression evaluation is faster
than through ScriptEvaluator.evaluate(Object[]), because it is not done through reflection but through direct method
invocation.
Example:
public interface Foo {
int bar(int a, int b);
}
...
Foo f = (Foo) ExpressionEvaluator.createFastExpressionEvaluator(
"a + b", // expression to evaluate
Foo.class, // interface that describes the expression's signature
new String[] { "a", "b" }, // the parameters' names
(ClassLoader) null // Use current thread's context class loader
);
System.out.println("1 + 2 = " + f.bar(1, 2)); // Evaluate the expression
Notice: The interfaceToImplement must either be declared public, or with package scope in the root package (i.e. "no" package).
On my system (Intel P4, 2 GHz, MS Windows XP, JDK 1.4.1), expression "x + 1" evaluates as follows:
| Server JVM | Client JVM | |
|---|---|---|
| Normal EE | 23.7 ns | 64.0 ns |
| Fast EE | 31.2 ns | 42.2 ns |
(How can it be that interface method invocation is slower than reflection for the server JVM?)
optionalOverrideMethod, optionalStaticMethodANY_TYPEDEFAULT_CLASS_NAMEBOOT_CLASS_LOADER, SYSTEM_PROPERTY_SOURCE_DEBUGGING_DIR, SYSTEM_PROPERTY_SOURCE_DEBUGGING_ENABLE| Constructor and Description |
|---|
ExpressionEvaluator() |
ExpressionEvaluator(String expression,
Class<?> expressionType,
String[] parameterNames,
Class<?>[] parameterTypes)
Equivalent to
ExpressionEvaluator ee = new ExpressionEvaluator();
ee.setExpressionType(expressionType);
ee.setParameters(parameterNames, parameterTypes);
ee.cook(expression);
|
ExpressionEvaluator(String expression,
Class<?> expressionType,
String[] parameterNames,
Class<?>[] parameterTypes,
Class<?>[] thrownExceptions,
Class<?> optionalExtendedType,
Class<?>[] implementedTypes,
ClassLoader optionalParentClassLoader)
Equivalent to
ExpressionEvaluator ee = new ExpressionEvaluator();
ee.setExpressionType(expressionType);
ee.setParameters(parameterNames, parameterTypes);
ee.setThrownExceptions(thrownExceptions);
ee.setExtendedType(optionalExtendedType);
ee.setImplementedTypes(implementedTypes);
ee.setParentClassLoader(optionalParentClassLoader);
ee.cook(expression);
|
ExpressionEvaluator(String expression,
Class<?> expressionType,
String[] parameterNames,
Class<?>[] parameterTypes,
Class<?>[] thrownExceptions,
ClassLoader optionalParentClassLoader)
Equivalent to
ExpressionEvaluator ee = new ExpressionEvaluator();
ee.setExpressionType(expressionType);
ee.setParameters(parameterNames, parameterTypes);
ee.setThrownExceptions(thrownExceptions);
ee.setParentClassLoader(optionalParentClassLoader);
ee.cook(expression);
|
| Modifier and Type | Method and Description |
|---|---|
void |
cook(String[] optionalFileNames,
Reader[] readers)
Same as
ICookable.cook(String, Reader), but cooks a set of scripts into one class. |
protected Class<?> |
getDefaultReturnType()
The default return type of an expression is
Object.class. |
void |
setExpressionType(Class<?> expressionType)
Defines the type of the expression.
|
void |
setExpressionTypes(Class<?>[] expressionTypes)
Configures the types of the expressions.
|
void |
setReturnType(Class<?> expressionType)
Deprecated.
Must not be used on an
IExpressionEvaluator; use setExpressionType(Class) instead |
void |
setReturnTypes(Class<?>[] expressionTypes)
Deprecated.
Must not be used on an
IExpressionEvaluator; use setExpressionTypes(Class[])
instead |
assertNotCooked, cook, cook, cook, cook, cook, createFastEvaluator, createFastEvaluator, createInstance, evaluate, evaluate, getMethod, getMethod, getMethods, getReturnType, setMethodName, setMethodNames, setOverrideMethod, setOverrideMethod, setParameters, setParameters, setStaticMethod, setStaticMethod, setThrownExceptions, setThrownExceptionscook, getClazz, parseImportDeclarations, setClassName, setDefaultImports, setExtendedClass, setExtendedType, setImplementedInterfaces, setImplementedTypesgetClassLoader, setCompileErrorHandler, setDebuggingInformation, setParentClassLoader, setParentClassLoader, setWarningHandlercook, cook, cook, cook, cook, cook, cook, cookFile, cookFile, cookFile, cookFile, readStringclone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, waitcreateFastEvaluator, createFastEvaluator, evaluatecook, cook, cook, evaluate, getMethod, getMethod, setMethodName, setMethodNames, setOverrideMethod, setOverrideMethod, setParameters, setParameters, setStaticMethod, setStaticMethod, setThrownExceptions, setThrownExceptionscreateInstance, getClazz, setClassName, setDefaultImports, setExtendedClass, setExtendedType, setImplementedInterfaces, setImplementedTypescook, cook, cook, cook, cook, cook, cook, cook, cookFile, cookFile, cookFile, cookFile, setCompileErrorHandler, setDebuggingInformation, setParentClassLoader, setWarningHandlerpublic ExpressionEvaluator(String expression, Class<?> expressionType, String[] parameterNames, Class<?>[] parameterTypes) throws CompileException
ExpressionEvaluator ee = new ExpressionEvaluator();
ee.setExpressionType(expressionType);
ee.setParameters(parameterNames, parameterTypes);
ee.cook(expression);
public ExpressionEvaluator(String expression, Class<?> expressionType, String[] parameterNames, Class<?>[] parameterTypes, Class<?>[] thrownExceptions, @Nullable ClassLoader optionalParentClassLoader) throws CompileException
ExpressionEvaluator ee = new ExpressionEvaluator();
ee.setExpressionType(expressionType);
ee.setParameters(parameterNames, parameterTypes);
ee.setThrownExceptions(thrownExceptions);
ee.setParentClassLoader(optionalParentClassLoader);
ee.cook(expression);
public ExpressionEvaluator(String expression, Class<?> expressionType, String[] parameterNames, Class<?>[] parameterTypes, Class<?>[] thrownExceptions, @Nullable Class<?> optionalExtendedType, Class<?>[] implementedTypes, @Nullable ClassLoader optionalParentClassLoader) throws CompileException
ExpressionEvaluator ee = new ExpressionEvaluator();
ee.setExpressionType(expressionType);
ee.setParameters(parameterNames, parameterTypes);
ee.setThrownExceptions(thrownExceptions);
ee.setExtendedType(optionalExtendedType);
ee.setImplementedTypes(implementedTypes);
ee.setParentClassLoader(optionalParentClassLoader);
ee.cook(expression);
CompileExceptionExpressionEvaluator(),
setExpressionType(Class),
ScriptEvaluator.setParameters(String[], Class[]),
ScriptEvaluator.setThrownExceptions(Class[]),
ClassBodyEvaluator.setExtendedClass(Class),
ClassBodyEvaluator.setImplementedInterfaces(Class[]),
SimpleCompiler.setParentClassLoader(ClassLoader),
Cookable.cook(String)public ExpressionEvaluator()
@Deprecated public void setReturnType(Class<?> expressionType)
IExpressionEvaluator; use setExpressionType(Class) insteadIScriptEvaluatornull is equivalent with void.class.setReturnType in interface IExpressionEvaluatorsetReturnType in interface IScriptEvaluatorsetReturnType in class ScriptEvaluator@Deprecated public void setReturnTypes(Class<?>[] expressionTypes)
IExpressionEvaluator; use setExpressionTypes(Class[])
insteadIScriptEvaluatornull.
Unless this method is invoked, the return type of all script is void.class.
setReturnTypes in interface IExpressionEvaluatorsetReturnTypes in interface IScriptEvaluatorsetReturnTypes in class ScriptEvaluatorpublic void setExpressionType(Class<?> expressionType)
IExpressionEvaluator
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.
setExpressionType in interface IExpressionEvaluatorpublic void setExpressionTypes(Class<?>[] expressionTypes)
IExpressionEvaluator
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.
setExpressionTypes in interface IExpressionEvaluatorprotected Class<?> getDefaultReturnType()
Object.class.getDefaultReturnType in class ScriptEvaluatorpublic void cook(@Nullable String[] optionalFileNames, Reader[] readers) throws CompileException, IOException
IScriptEvaluatorICookable.cook(String, Reader), but cooks a set of scripts into one class. Notice that
if any of the scripts causes trouble, the entire compilation will fail. If you
need to report which of the scripts causes the exception, you may want to use the
optionalFileNames parameter to distinguish between the individual token sources.
Iff the number of scanners is one, then that single script may contain leading IMPORT directives.
scook in interface IScriptEvaluatorcook in class ScriptEvaluatorCompileExceptionIOException