Class ExpressionEvaluator
- java.lang.Object
-
- org.codehaus.commons.compiler.Cookable
-
- org.codehaus.janino.SimpleCompiler
-
- org.codehaus.janino.ClassBodyEvaluator
-
- org.codehaus.janino.ScriptEvaluator
-
- org.codehaus.janino.ExpressionEvaluator
-
- All Implemented Interfaces:
IClassBodyEvaluator
,ICookable
,IExpressionEvaluator
,IScriptEvaluator
,ISimpleCompiler
public class ExpressionEvaluator extends ScriptEvaluator implements IExpressionEvaluator
ThisIExpressionEvaluator
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 throughScriptEvaluator.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: TheinterfaceToImplement
must either be declaredpublic
, 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 Modifier and Type Field Description private java.lang.Class[]
optionalExpressionTypes
-
Fields inherited from class org.codehaus.janino.ScriptEvaluator
optionalOverrideMethod, optionalReturnTypes, optionalStaticMethod
-
Fields inherited from interface org.codehaus.commons.compiler.IClassBodyEvaluator
DEFAULT_CLASS_NAME
-
Fields inherited from interface org.codehaus.commons.compiler.ICookable
BOOT_CLASS_LOADER, SYSTEM_PROPERTY_SOURCE_DEBUGGING_DIR, SYSTEM_PROPERTY_SOURCE_DEBUGGING_ENABLE
-
Fields inherited from interface org.codehaus.commons.compiler.IExpressionEvaluator
ANY_TYPE
-
-
Constructor Summary
Constructors Constructor Description ExpressionEvaluator()
ExpressionEvaluator(java.lang.String expression, java.lang.Class expressionType, java.lang.String[] parameterNames, java.lang.Class[] parameterTypes)
Equivalent toExpressionEvaluator(java.lang.String expression, java.lang.Class expressionType, java.lang.String[] parameterNames, java.lang.Class[] parameterTypes, java.lang.Class[] thrownExceptions, java.lang.ClassLoader optionalParentClassLoader)
Equivalent toExpressionEvaluator(java.lang.String expression, java.lang.Class expressionType, java.lang.String[] parameterNames, java.lang.Class[] parameterTypes, java.lang.Class[] thrownExceptions, java.lang.Class optionalExtendedType, java.lang.Class[] implementedTypes, java.lang.ClassLoader optionalParentClassLoader)
Equivalent toExpressionEvaluator(Scanner scanner, java.lang.String className, java.lang.Class optionalExtendedType, java.lang.Class[] implementedTypes, boolean staticMethod, java.lang.Class expressionType, java.lang.String methodName, java.lang.String[] parameterNames, java.lang.Class[] parameterTypes, java.lang.Class[] thrownExceptions, java.lang.ClassLoader optionalParentClassLoader)
Equivalent to
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Deprecated Methods Modifier and Type Method Description static java.lang.Object
createFastExpressionEvaluator(java.lang.String expression, java.lang.Class interfaceToImplement, java.lang.String[] parameterNames, java.lang.ClassLoader optionalParentClassLoader)
Deprecated.static java.lang.Object
createFastExpressionEvaluator(Scanner scanner, java.lang.String[] optionalDefaultImports, java.lang.String className, java.lang.Class optionalExtendedType, java.lang.Class interfaceToImplement, java.lang.String[] parameterNames, java.lang.ClassLoader optionalParentClassLoader)
Deprecated.static java.lang.Object
createFastExpressionEvaluator(Scanner scanner, java.lang.String className, java.lang.Class optionalExtendedType, java.lang.Class interfaceToImplement, java.lang.String[] parameterNames, java.lang.ClassLoader optionalParentClassLoader)
Deprecated.protected java.lang.Class
getDefaultReturnType()
static java.lang.String[]
guessParameterNames(Scanner scanner)
Guess the names of the parameters used in the given expression.protected java.util.List<Java.BlockStatement>
makeStatements(int idx, Parser parser)
Fills the givenblock
by parsing statements until EOF and adding them to the block.void
setExpressionType(java.lang.Class expressionType)
Define the type of the expression.void
setExpressionTypes(java.lang.Class[] expressionTypes)
Same asIExpressionEvaluator.setExpressionType(Class)
, but for multiple expressions.void
setReturnType(java.lang.Class returnType)
Deprecated.setExpressionType(Class)
should be called instead.void
setReturnTypes(java.lang.Class[] returnTypes)
Deprecated.setExpressionTypes(Class[])
should be called instead.-
Methods inherited from class org.codehaus.janino.ScriptEvaluator
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, setThrownExceptions
-
Methods inherited from class org.codehaus.janino.ClassBodyEvaluator
addPackageMemberClassDeclaration, compileToClass, createFastClassBodyEvaluator, createFastClassBodyEvaluator, getClazz, makeCompilationUnit, setClassName, setDefaultImports, setExtendedClass, setExtendedType, setImplementedInterfaces, setImplementedTypes
-
Methods inherited from class org.codehaus.janino.SimpleCompiler
assertNotCooked, classesToTypes, classToType, compileToClassLoader, cook, cook, equals, getClassLoader, hashCode, main, setCompileErrorHandler, setDebuggingInformation, setParentClassLoader, setWarningHandler
-
Methods inherited from class org.codehaus.commons.compiler.Cookable
cook, cook, cook, cook, cook, cook, cook, cookFile, cookFile, cookFile, cookFile, readString
-
Methods inherited from class java.lang.Object
clone, finalize, getClass, notify, notifyAll, toString, wait, wait, wait
-
Methods inherited from interface org.codehaus.commons.compiler.IClassBodyEvaluator
createInstance, getClazz, setClassName, setDefaultImports, setExtendedClass, setExtendedType, setImplementedInterfaces, setImplementedTypes
-
Methods inherited from interface org.codehaus.commons.compiler.ICookable
cook, cook, cook, cook, cook, cook, cook, cook, cookFile, cookFile, cookFile, cookFile, setCompileErrorHandler, setDebuggingInformation, setParentClassLoader, setWarningHandler
-
Methods inherited from interface org.codehaus.commons.compiler.IExpressionEvaluator
createFastEvaluator, createFastEvaluator, evaluate
-
Methods 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 Detail
-
ExpressionEvaluator
public ExpressionEvaluator(java.lang.String expression, java.lang.Class expressionType, java.lang.String[] parameterNames, java.lang.Class[] parameterTypes) throws CompileException
Equivalent toExpressionEvaluator ee = new ExpressionEvaluator(); ee.setExpressionType(expressionType); ee.setParameters(parameterNames, parameterTypes); ee.cook(expression);
-
ExpressionEvaluator
public ExpressionEvaluator(java.lang.String expression, java.lang.Class expressionType, java.lang.String[] parameterNames, java.lang.Class[] parameterTypes, java.lang.Class[] thrownExceptions, java.lang.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);
-
ExpressionEvaluator
public ExpressionEvaluator(java.lang.String expression, java.lang.Class expressionType, java.lang.String[] parameterNames, java.lang.Class[] parameterTypes, java.lang.Class[] thrownExceptions, java.lang.Class optionalExtendedType, java.lang.Class[] implementedTypes, java.lang.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()
,setExpressionType(Class)
,ScriptEvaluator.setParameters(String[], Class[])
,ScriptEvaluator.setThrownExceptions(Class[])
,ClassBodyEvaluator.setExtendedClass(Class)
,ClassBodyEvaluator.setImplementedInterfaces(Class[])
,SimpleCompiler.setParentClassLoader(ClassLoader)
,Cookable.cook(String)
-
ExpressionEvaluator
public ExpressionEvaluator(Scanner scanner, java.lang.String className, java.lang.Class optionalExtendedType, java.lang.Class[] implementedTypes, boolean staticMethod, java.lang.Class expressionType, java.lang.String methodName, java.lang.String[] parameterNames, java.lang.Class[] parameterTypes, java.lang.Class[] thrownExceptions, java.lang.ClassLoader optionalParentClassLoader) throws CompileException, java.io.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:
CompileException
java.io.IOException
- See Also:
IExpressionEvaluator
,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)
-
ExpressionEvaluator
public ExpressionEvaluator()
-
-
Method Detail
-
setExpressionType
public void setExpressionType(java.lang.Class expressionType)
Description copied from interface:IExpressionEvaluator
Define the type of the expression. The special typeIExpressionEvaluator.ANY_TYPE
allows the expression to return any type (primitive or reference).If
expressionType
isVoid.TYPE
, then the expression must be an invocation of avoid
method.Defaults to
IExpressionEvaluator.ANY_TYPE
.- Specified by:
setExpressionType
in interfaceIExpressionEvaluator
-
setExpressionTypes
public void setExpressionTypes(java.lang.Class[] expressionTypes)
Description copied from interface:IExpressionEvaluator
Same asIExpressionEvaluator.setExpressionType(Class)
, but for multiple expressions.- Specified by:
setExpressionTypes
in interfaceIExpressionEvaluator
-
setReturnType
@Deprecated public final void setReturnType(java.lang.Class returnType)
Deprecated.setExpressionType(Class)
should be called instead.Description copied from class:ScriptEvaluator
Defines the return types of the generated methods.- Specified by:
setReturnType
in interfaceIExpressionEvaluator
- Specified by:
setReturnType
in interfaceIScriptEvaluator
- Overrides:
setReturnType
in classScriptEvaluator
- Parameters:
returnType
- The method's return type;null
means the "default return type", which is the type returned byScriptEvaluator.getDefaultReturnType()
(void.class
forScriptEvaluator
andObject.class
forExpressionEvaluator
)- See Also:
ScriptEvaluator.getDefaultReturnType()
,getDefaultReturnType()
-
setReturnTypes
@Deprecated public final void setReturnTypes(java.lang.Class[] returnTypes)
Deprecated.setExpressionTypes(Class[])
should be called instead.Description copied from class:ScriptEvaluator
Defines the return types of the generated methods.- Specified by:
setReturnTypes
in interfaceIExpressionEvaluator
- Specified by:
setReturnTypes
in interfaceIScriptEvaluator
- Overrides:
setReturnTypes
in classScriptEvaluator
- Parameters:
returnTypes
- The methods' return types;null
elements mean the "default return type", which is the type returned byScriptEvaluator.getDefaultReturnType()
(void.class
forScriptEvaluator
andObject.class
forExpressionEvaluator
)- See Also:
ScriptEvaluator.getDefaultReturnType()
,getDefaultReturnType()
-
getDefaultReturnType
protected java.lang.Class getDefaultReturnType()
- Overrides:
getDefaultReturnType
in classScriptEvaluator
- Returns:
void.class
- See Also:
ScriptEvaluator.setReturnTypes(Class[])
-
makeStatements
protected java.util.List<Java.BlockStatement> makeStatements(int idx, Parser parser) throws CompileException, java.io.IOException
Description copied from class:ScriptEvaluator
Fills the givenblock
by parsing statements until EOF and adding them to the block.- Overrides:
makeStatements
in classScriptEvaluator
- Throws:
CompileException
java.io.IOException
-
createFastExpressionEvaluator
@Deprecated public static java.lang.Object createFastExpressionEvaluator(java.lang.String expression, java.lang.Class interfaceToImplement, java.lang.String[] parameterNames, java.lang.ClassLoader optionalParentClassLoader) throws CompileException
Deprecated.IExpressionEvaluator
ee =CompilerFactoryFactory
.getDefaultCompilerFactory
().newExpressionEvaluator
(); ee.setParentClassLoader(optionalParentClassLoader); return ee.createFastEvaluator
(expression, interfaceToImplement, parameterNames);- Throws:
CompileException
-
createFastExpressionEvaluator
@Deprecated public static java.lang.Object createFastExpressionEvaluator(Scanner scanner, java.lang.String className, java.lang.Class optionalExtendedType, java.lang.Class interfaceToImplement, java.lang.String[] parameterNames, java.lang.ClassLoader optionalParentClassLoader) throws CompileException, java.io.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:
CompileException
java.io.IOException
-
createFastExpressionEvaluator
@Deprecated public static java.lang.Object createFastExpressionEvaluator(Scanner scanner, java.lang.String[] optionalDefaultImports, java.lang.String className, java.lang.Class optionalExtendedType, java.lang.Class interfaceToImplement, java.lang.String[] parameterNames, java.lang.ClassLoader optionalParentClassLoader) throws CompileException, java.io.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:
CompileException
java.io.IOException
-
guessParameterNames
public static java.lang.String[] guessParameterNames(Scanner scanner) throws CompileException, java.io.IOException
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:
CompileException
java.io.IOException
- See Also:
Scanner(String, Reader)
-
-