Class ExpressionEvaluator
- All Implemented Interfaces:
IClassBodyEvaluator,ICookable,IExpressionEvaluator,IScriptEvaluator,ISimpleCompiler
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 |
-
Field Summary
Fields inherited from class org.codehaus.janino.ScriptEvaluator
optionalMethodNames, optionalOverrideMethod, optionalParameterNames, optionalParameterTypes, optionalReturnTypes, optionalStaticMethod, optionalThrownExceptionsFields inherited from class org.codehaus.janino.ClassBodyEvaluator
className, ZERO_CLASSESFields inherited from class org.codehaus.janino.SimpleCompiler
debugLines, debugSource, debugVarsFields inherited from interface org.codehaus.commons.compiler.IClassBodyEvaluator
DEFAULT_CLASS_NAMEFields inherited from interface org.codehaus.commons.compiler.ICookable
BOOT_CLASS_LOADER, SYSTEM_PROPERTY_SOURCE_DEBUGGING_DIR, SYSTEM_PROPERTY_SOURCE_DEBUGGING_ENABLEFields inherited from interface org.codehaus.commons.compiler.IExpressionEvaluator
ANY_TYPE -
Constructor Summary
ConstructorsConstructorDescriptionExpressionEvaluator(String expression, Class expressionType, String[] parameterNames, Class[] parameterTypes) Equivalent toExpressionEvaluator(String expression, Class expressionType, String[] parameterNames, Class[] parameterTypes, Class[] thrownExceptions, ClassLoader optionalParentClassLoader) Equivalent toExpressionEvaluator(String expression, Class expressionType, String[] parameterNames, Class[] parameterTypes, Class[] thrownExceptions, Class optionalExtendedType, Class[] implementedTypes, ClassLoader optionalParentClassLoader) Equivalent toExpressionEvaluator(Scanner scanner, String className, Class optionalExtendedType, Class[] implementedTypes, boolean staticMethod, Class expressionType, String methodName, String[] parameterNames, Class[] parameterTypes, Class[] thrownExceptions, ClassLoader optionalParentClassLoader) Equivalent to -
Method Summary
Modifier and TypeMethodDescriptionstatic ObjectcreateFastExpressionEvaluator(String expression, Class interfaceToImplement, String[] parameterNames, ClassLoader optionalParentClassLoader) Deprecated.static ObjectcreateFastExpressionEvaluator(Scanner scanner, String[] optionalDefaultImports, String className, Class optionalExtendedType, Class interfaceToImplement, String[] parameterNames, ClassLoader optionalParentClassLoader) Deprecated.static ObjectcreateFastExpressionEvaluator(Scanner scanner, String className, Class optionalExtendedType, Class interfaceToImplement, String[] parameterNames, ClassLoader optionalParentClassLoader) Deprecated.protected Classstatic String[]guessParameterNames(Scanner scanner) Guess the names of the parameters used in the given expression.protected ListmakeStatements(int idx, Parser parser) Fill the givenblockby parsing statements until EOF and adding them to the block.voidsetExpressionType(Class expressionType) Define the type of the expression.voidsetExpressionTypes(Class[] expressionTypes) Same asIExpressionEvaluator.setExpressionType(Class), but for multiple expressions.final voidsetReturnType(Class returnType) Deprecated.final voidsetReturnTypes(Class[] returnTypes) Deprecated.Methods inherited from class org.codehaus.janino.ScriptEvaluator
compileToMethods, cook, cook, cook, cook, cook, cook, cook, createFastEvaluator, createFastEvaluator, createFastEvaluator, createFastScriptEvaluator, createFastScriptEvaluator, createFastScriptEvaluator, createFastScriptEvaluator, createInstance, evaluate, evaluate, getMethod, getMethod, makeMethodDeclaration, setMethodName, setMethodNames, setOverrideMethod, setOverrideMethod, setParameters, setParameters, setStaticMethod, setStaticMethod, setThrownExceptions, setThrownExceptionsMethods inherited from class org.codehaus.janino.ClassBodyEvaluator
addPackageMemberClassDeclaration, compileToClass, createFastClassBodyEvaluator, createFastClassBodyEvaluator, getClazz, makeCompilationUnit, setClassName, setDefaultImports, setExtendedClass, setExtendedType, setImplementedInterfaces, setImplementedTypesMethods inherited from class org.codehaus.janino.SimpleCompiler
assertNotCooked, classesToTypes, classToType, compileToClassLoader, cook, cook, equals, getClassLoader, hashCode, main, setDebuggingInformation, setParentClassLoaderMethods inherited from class org.codehaus.commons.compiler.Cookable
cook, cook, cook, cook, cook, cook, cook, cookFile, cookFile, cookFile, cookFile, readStringMethods inherited from class java.lang.Object
clone, finalize, getClass, notify, notifyAll, toString, wait, wait, waitMethods inherited from interface org.codehaus.commons.compiler.IClassBodyEvaluator
createInstance, getClazz, setClassName, setDefaultImports, setExtendedClass, setExtendedType, setImplementedInterfaces, setImplementedTypesMethods inherited from interface org.codehaus.commons.compiler.ICookable
cook, cook, cook, cook, cook, cook, cook, cook, cookFile, cookFile, cookFile, cookFile, setDebuggingInformation, setParentClassLoaderMethods inherited from interface org.codehaus.commons.compiler.IExpressionEvaluator
createFastEvaluator, createFastEvaluator, evaluateMethods inherited from interface org.codehaus.commons.compiler.IScriptEvaluator
cook, cook, cook, cook, evaluate, getMethod, getMethod, setMethodName, setMethodNames, setOverrideMethod, setOverrideMethod, setParameters, setParameters, setStaticMethod, setStaticMethod, setThrownExceptions, setThrownExceptions
-
Constructor Details
-
ExpressionEvaluator
public ExpressionEvaluator(String expression, Class expressionType, String[] parameterNames, Class[] parameterTypes) throws CompileException Equivalent toExpressionEvaluator ee = new ExpressionEvaluator(); ee.setExpressionType(expressionType); ee.setParameters(parameterNames, parameterTypes); ee.cook(expression);
- Throws:
CompileException- See Also:
-
ExpressionEvaluator
public ExpressionEvaluator(String expression, Class expressionType, String[] parameterNames, Class[] parameterTypes, Class[] thrownExceptions, ClassLoader optionalParentClassLoader) throws CompileException Equivalent toExpressionEvaluator ee = new ExpressionEvaluator(); ee.setExpressionType(expressionType); ee.setParameters(parameterNames, parameterTypes); ee.setThrownExceptions(thrownExceptions); ee.setParentClassLoader(optionalParentClassLoader); ee.cook(expression);
- Throws:
CompileException- See Also:
-
ExpressionEvaluator
public ExpressionEvaluator(String expression, Class expressionType, String[] parameterNames, Class[] parameterTypes, Class[] thrownExceptions, Class optionalExtendedType, Class[] implementedTypes, ClassLoader optionalParentClassLoader) throws CompileException Equivalent toExpressionEvaluator 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);
- Throws:
CompileException- See Also:
-
ExpressionEvaluator
public ExpressionEvaluator(Scanner scanner, String className, Class optionalExtendedType, Class[] implementedTypes, boolean staticMethod, Class expressionType, String methodName, String[] parameterNames, Class[] parameterTypes, Class[] thrownExceptions, ClassLoader optionalParentClassLoader) throws CompileException, IOException Equivalent toExpressionEvaluator 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);
- Throws:
CompileExceptionIOException- See Also:
-
ExpressionEvaluator
public ExpressionEvaluator()
-
-
Method Details
-
setExpressionType
Description copied from interface:IExpressionEvaluatorDefine the type of the expression. The special typeIExpressionEvaluator.ANY_TYPEallows the expression to return any type (primitive or reference).If
expressionTypeisVoid.TYPE, then the expression must be an invocation of avoidmethod.Defaults to
IExpressionEvaluator.ANY_TYPE.- Specified by:
setExpressionTypein interfaceIExpressionEvaluator
-
setExpressionTypes
Description copied from interface:IExpressionEvaluatorSame asIExpressionEvaluator.setExpressionType(Class), but for multiple expressions.- Specified by:
setExpressionTypesin interfaceIExpressionEvaluator
-
setReturnType
Deprecated.Description copied from interface:IScriptEvaluatorDefines the return type of the generated method. The meaning of anullvalue is implementation-dependent.- Specified by:
setReturnTypein interfaceIExpressionEvaluator- Specified by:
setReturnTypein interfaceIScriptEvaluator- Overrides:
setReturnTypein classScriptEvaluator
-
setReturnTypes
Deprecated.Description copied from class:ScriptEvaluatorDefines the return types of the generated methods.- Specified by:
setReturnTypesin interfaceIExpressionEvaluator- Specified by:
setReturnTypesin interfaceIScriptEvaluator- Overrides:
setReturnTypesin classScriptEvaluator- Parameters:
returnTypes- The methods' return types;nullvalues mean the "default return type", which is the type returned byScriptEvaluator.getDefaultReturnType()(void.classforScriptEvaluatorandObject.classforExpressionEvaluator)- See Also:
-
getDefaultReturnType
- Overrides:
getDefaultReturnTypein classScriptEvaluator- Returns:
void.class- See Also:
-
makeStatements
Description copied from class:ScriptEvaluatorFill the givenblockby parsing statements until EOF and adding them to the block.- Overrides:
makeStatementsin classScriptEvaluator- Throws:
CompileExceptionIOException
-
createFastExpressionEvaluator
@Deprecated public static Object createFastExpressionEvaluator(String expression, Class interfaceToImplement, String[] parameterNames, ClassLoader optionalParentClassLoader) throws CompileException Deprecated.IExpressionEvaluatoree =CompilerFactoryFactory.getDefaultCompilerFactory().newExpressionEvaluator(); ee.setParentClassLoader(optionalParentClassLoader); return ee.createFastEvaluator(expression, interfaceToImplement, parameterNames);- Throws:
CompileException
-
createFastExpressionEvaluator
@Deprecated public static Object createFastExpressionEvaluator(Scanner scanner, String className, Class optionalExtendedType, Class interfaceToImplement, String[] parameterNames, ClassLoader optionalParentClassLoader) throws CompileException, IOException Deprecated.Notice: This method is not declared inIExpressionEvaluator, and is hence only available in this implementation oforg.codehaus.commons.compiler. To be independent from this particular implementation, try to switch toScriptEvaluator.createFastEvaluator(Reader, Class, String[]).- Throws:
CompileExceptionIOException
-
createFastExpressionEvaluator
@Deprecated public static Object createFastExpressionEvaluator(Scanner scanner, String[] optionalDefaultImports, String className, Class optionalExtendedType, Class interfaceToImplement, String[] parameterNames, ClassLoader optionalParentClassLoader) throws CompileException, IOException Deprecated.Notice: This method is not declared inIExpressionEvaluator, and is hence only available in this implementation oforg.codehaus.commons.compiler. To be independent from this particular implementation, try to switch toScriptEvaluator.createFastEvaluator(Reader, Class, String[]).- Throws:
CompileExceptionIOException
-
guessParameterNames
Guess the names of the parameters used in the given expression. The strategy is to look at all "ambiguous names" in the expression (e.g. in "a.b.c.d()", the ambiguous name is "a.b.c"), and then at the first components of the ambiguous name.- If any component starts with an upper-case letter, then ambiguous name is assumed to be a type name.
- Otherwise, it is assumed to be a parameter name.
- Throws:
CompileExceptionIOException- See Also:
-
ScriptEvaluator.createFastEvaluator(String, Class, String[])instead: