org.codehaus.commons.compiler.jdk
Class ExpressionEvaluator
java.lang.Object
org.codehaus.commons.compiler.Cookable
org.codehaus.commons.compiler.jdk.SimpleCompiler
org.codehaus.commons.compiler.jdk.ClassBodyEvaluator
org.codehaus.commons.compiler.jdk.ScriptEvaluator
org.codehaus.commons.compiler.jdk.ExpressionEvaluator
- All Implemented Interfaces:
- IClassBodyEvaluator, ICookable, IExpressionEvaluator, IScriptEvaluator, ISimpleCompiler
public class ExpressionEvaluator
- extends ScriptEvaluator
- implements IExpressionEvaluator
This 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?)
Constructor Summary |
ExpressionEvaluator()
|
ExpressionEvaluator(java.lang.String expression,
java.lang.Class<?> expressionType,
java.lang.String[] parameterNames,
java.lang.Class<?>[] parameterTypes)
Equivalent to |
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)
Equivalent to |
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)
Equivalent to |
Methods inherited from class org.codehaus.commons.compiler.jdk.ScriptEvaluator |
cook, cook, cook, cook, cook, createFastEvaluator, createFastEvaluator, createInstance, evaluate, evaluate, getMethod, getMethod, setMethodName, setMethodNames, setParameters, setParameters, setReturnType, setReturnTypes, setStaticMethod, setStaticMethod, setThrownExceptions, setThrownExceptions |
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, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
Methods inherited from interface org.codehaus.commons.compiler.IScriptEvaluator |
cook, cook, cook, evaluate, getMethod, getMethod, setMethodName, setMethodNames, setParameters, setParameters, setReturnType, setReturnTypes, setStaticMethod, setStaticMethod, setThrownExceptions, setThrownExceptions |
Methods inherited from interface org.codehaus.commons.compiler.ICookable |
cook, cook, cook, cook, cook, cook, cook, cook, cookFile, cookFile, cookFile, cookFile, setDebuggingInformation, setParentClassLoader |
ExpressionEvaluator
public ExpressionEvaluator(java.lang.String expression,
java.lang.Class<?> expressionType,
java.lang.String[] parameterNames,
java.lang.Class<?>[] parameterTypes)
throws CompileException
- Equivalent to
ExpressionEvaluator ee = new ExpressionEvaluator();
ee.setExpressionType(expressionType);
ee.setParameters(parameterNames, parameterTypes);
ee.cook(expression);
- Throws:
CompileException
- See Also:
ExpressionEvaluator()
,
setExpressionType(Class)
,
ScriptEvaluator.setParameters(String[], Class[])
,
Cookable.cook(String)
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 to
ExpressionEvaluator ee = new ExpressionEvaluator();
ee.setExpressionType(expressionType);
ee.setParameters(parameterNames, parameterTypes);
ee.setThrownExceptions(thrownExceptions);
ee.setParentClassLoader(optionalParentClassLoader);
ee.cook(expression);
- Throws:
CompileException
- See Also:
ExpressionEvaluator()
,
setExpressionType(Class)
,
ScriptEvaluator.setParameters(String[], Class[])
,
ScriptEvaluator.setThrownExceptions(Class[])
,
SimpleCompiler.setParentClassLoader(ClassLoader)
,
Cookable.cook(String)
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 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);
- 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()
setExpressionType
public void setExpressionType(java.lang.Class expressionType)
- Description copied from interface:
IExpressionEvaluator
- Define the type of the expression. The special type
IExpressionEvaluator.ANY_TYPE
allows the expression
to return any type (primitive or reference).
If expressionType
is Void.TYPE
, then the expression must be an
invocation of a void
method.
Defaults to IExpressionEvaluator.ANY_TYPE
.
- Specified by:
setExpressionType
in interface IExpressionEvaluator
setExpressionTypes
public void setExpressionTypes(java.lang.Class[] expressionTypes)
- Specified by:
setExpressionTypes
in interface IExpressionEvaluator
getDefaultReturnType
protected java.lang.Class<?> getDefaultReturnType()
- Overrides:
getDefaultReturnType
in class ScriptEvaluator
cook
public void cook(java.lang.String[] optionalFileNames,
java.io.Reader[] readers)
throws CompileException,
java.io.IOException
- Description copied from interface:
IScriptEvaluator
- Same as
ICookable.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.
If and only if the number of scanners is one, then that single script may contain leading
IMPORT directives.
- Specified by:
cook
in interface IScriptEvaluator
- Overrides:
cook
in class ScriptEvaluator
- Throws:
CompileException
java.io.IOException
Copyright © 2001-2011. All Rights Reserved.