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 createFastExpressionEvaluator(String, Class, String[], ClassLoader).
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?)
DEFAULT_METHOD_NAMEANY_TYPEDEFAULT_CLASS_NAMEBOOT_CLASS_LOADER, SYSTEM_PROPERTY_SOURCE_DEBUGGING_DIR, SYSTEM_PROPERTY_SOURCE_DEBUGGING_ENABLE| Constructor and Description |
|---|
ExpressionEvaluator() |
ExpressionEvaluator(Scanner scanner,
String className,
Class<?> optionalExtendedType,
Class<?>[] implementedTypes,
boolean staticMethod,
Class<?> expressionType,
String methodName,
String[] parameterNames,
Class<?>[] parameterTypes,
Class<?>[] thrownExceptions,
ClassLoader optionalParentClassLoader)
Creates an expression evaluator with the full configurability.
|
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 |
|---|---|
static Object |
createFastExpressionEvaluator(Scanner scanner,
String[] optionalDefaultImports,
String className,
Class<?> optionalExtendedType,
Class<?> interfaceToImplement,
String[] parameterNames,
ClassLoader optionalParentClassLoader)
Deprecated.
|
static Object |
createFastExpressionEvaluator(Scanner scanner,
String className,
Class<?> optionalExtendedType,
Class<?> interfaceToImplement,
String[] parameterNames,
ClassLoader optionalParentClassLoader)
Deprecated.
|
static Object |
createFastExpressionEvaluator(String expression,
Class<?> interfaceToImplement,
String[] parameterNames,
ClassLoader optionalParentClassLoader)
Deprecated.
|
protected Class<?> |
getDefaultReturnType() |
static String[] |
guessParameterNames(Scanner scanner)
Guess the names of the parameters used in the given expression.
|
protected void |
makeStatements(int idx,
Parser parser,
List<Java.BlockStatement> resultStatements,
List<Java.MethodDeclarator> resultMethods)
Parses statements from the parser until end-of-input.
|
void |
setExpressionType(Class<?> expressionType) |
void |
setExpressionTypes(Class<?>[] expressionTypes) |
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 |
cook, cook, cook, cook, cook, cook, cook, cook2, createFastEvaluator, createFastEvaluator, createFastEvaluator, createFastScriptEvaluator, createFastScriptEvaluator, createFastScriptEvaluator, createFastScriptEvaluator, createInstance, evaluate, evaluate, getMethod, getMethod, getReturnType, setMethodName, setMethodNames, setOverrideMethod, setOverrideMethod, setParameters, setParameters, setScriptCount, setStaticMethod, setStaticMethod, setThrownExceptions, setThrownExceptionsaddPackageMemberClassDeclaration, compileToClass, createFastClassBodyEvaluator, createFastClassBodyEvaluator, getClazz, makeCompilationUnit, setClassName, setDefaultImports, setExtendedClass, setExtendedType, setImplementedInterfaces, setImplementedTypesclassesToTypes, classToType, compileToClassLoader, cook, cook, cook, cook, equals, getClassLoader, hashCode, main, optionalClassToType, options, options, setCompileErrorHandler, setDebuggingInformation, setNoPermissions, setParentClassLoader, setPermissions, setWarningHandlercook, cook, cook, cook, cook, cook, cook, cookFile, cookFile, cookFile, cookFile, readStringclone, finalize, getClass, notify, notifyAll, toString, wait, wait, waitcreateFastEvaluator, createFastEvaluator, evaluatecook, cook, cook, cook, evaluate, getMethod, getMethod, setMethodName, setMethodNames, setOverrideMethod, setOverrideMethod, setParameters, setParameters, setStaticMethod, setStaticMethod, setThrownExceptions, setThrownExceptionscreateInstance, getClazz, setClassName, setDefaultImports, setExtendedClass, setExtendedType, setImplementedInterfaces, setImplementedTypesgetClassLoader, setNoPermissions, setPermissionscook, 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(Scanner scanner, String className, @Nullable Class<?> optionalExtendedType, Class<?>[] implementedTypes, boolean staticMethod, Class<?> expressionType, String methodName, String[] parameterNames, Class<?>[] parameterTypes, Class<?>[] thrownExceptions, @Nullable ClassLoader optionalParentClassLoader) throws CompileException, IOException
Equivalent to:
ExpressionEvaluator ee = new ExpressionEvaluator();
ee.setClassName(className);
ee.setExtendedType(optionalExtendedType);
ee.setImplementedTypes(implementedTypes);
ee.setStaticMethod(staticMethod);
ee.setExpressionType(expressionType);
ee.setMethodName(methodName);
ee.setParameters(parameterNames, parameterTypes);
ee.setThrownExceptions(thrownExceptions);
ee.setParentClassLoader(optionalParentClassLoader);
ee.cook(scanner);
CompileExceptionIOExceptionIExpressionEvaluator,
IClassBodyEvaluator.setClassName(String),
IClassBodyEvaluator.setExtendedClass(Class),
IClassBodyEvaluator.setImplementedInterfaces(Class[]),
IScriptEvaluator.setStaticMethod(boolean),
IExpressionEvaluator.setExpressionType(Class),
IScriptEvaluator.setMethodName(String),
IScriptEvaluator.setParameters(String[], Class[]),
IScriptEvaluator.setThrownExceptions(Class[]),
ICookable.setParentClassLoader(ClassLoader),
ICookable.cook(Reader)public ExpressionEvaluator()
@Deprecated public void setReturnType(Class<?> expressionType)
IExpressionEvaluator; use setExpressionType(Class) insteadScriptEvaluatorsetReturnType in interface IExpressionEvaluatorsetReturnType in interface IScriptEvaluatorsetReturnType in class ScriptEvaluatorexpressionType - The method's return type; null means the "default return type", which is the type
returned by ScriptEvaluator.getDefaultReturnType() (void.class for ScriptEvaluator
and Object.class for ExpressionEvaluator)ScriptEvaluator.getDefaultReturnType(),
getDefaultReturnType()@Deprecated public void setReturnTypes(Class<?>[] expressionTypes)
IExpressionEvaluator; use setExpressionTypes(Class[])
insteadScriptEvaluatorsetReturnTypes in interface IExpressionEvaluatorsetReturnTypes in interface IScriptEvaluatorsetReturnTypes in class ScriptEvaluatorexpressionTypes - The methods' return types; null elements mean the "default return type", which is the
type returned by ScriptEvaluator.getDefaultReturnType() (void.class for ScriptEvaluator and Object.class for ExpressionEvaluator)ScriptEvaluator.getDefaultReturnType(),
getDefaultReturnType()public void setExpressionType(Class<?> expressionType)
setExpressionType in interface IExpressionEvaluatorpublic void setExpressionTypes(Class<?>[] expressionTypes)
setExpressionTypes in interface IExpressionEvaluatorprotected Class<?> getDefaultReturnType()
getDefaultReturnType in class ScriptEvaluatorvoid.classScriptEvaluator.setReturnTypes(Class[])protected void makeStatements(int idx,
Parser parser,
List<Java.BlockStatement> resultStatements,
List<Java.MethodDeclarator> resultMethods)
throws CompileException,
IOException
ScriptEvaluatormakeStatements in class ScriptEvaluatorresultStatements - Is filled with the generated statementsresultMethods - Is filled with any local methods that the script declaresCompileExceptionIOException@Deprecated public static Object createFastExpressionEvaluator(String expression, Class<?> interfaceToImplement, String[] parameterNames, @Nullable ClassLoader optionalParentClassLoader) throws CompileException
ScriptEvaluator.createFastEvaluator(String, Class, String[]) instead:CompileException@Deprecated public static Object createFastExpressionEvaluator(Scanner scanner, String className, @Nullable Class<?> optionalExtendedType, Class<?> interfaceToImplement, String[] parameterNames, @Nullable ClassLoader optionalParentClassLoader) throws CompileException, IOException
ScriptEvaluator.createFastEvaluator(Reader, Class, String[]) insteadCompileExceptionIOException@Deprecated public static Object createFastExpressionEvaluator(Scanner scanner, @Nullable String[] optionalDefaultImports, String className, @Nullable Class<?> optionalExtendedType, Class<?> interfaceToImplement, String[] parameterNames, @Nullable ClassLoader optionalParentClassLoader) throws CompileException, IOException
ScriptEvaluator.createFastEvaluator(Reader, Class, String[]) insteadCompileExceptionIOExceptionpublic static String[] guessParameterNames(Scanner scanner) throws CompileException, IOException
CompileExceptionIOExceptionScanner.Scanner(String, Reader)Copyright © 2019. All rights reserved.