org.codehaus.commons.compiler.jdk
Class ExpressionEvaluator

java.lang.Object
  extended by org.codehaus.commons.compiler.Cookable
      extended by org.codehaus.commons.compiler.jdk.SimpleCompiler
          extended by org.codehaus.commons.compiler.jdk.ClassBodyEvaluator
              extended by org.codehaus.commons.compiler.jdk.ScriptEvaluator
                  extended by 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 JVMClient JVM
Normal EE23.7 ns64.0 ns
Fast EE31.2 ns42.2 ns
(How can it be that interface method invocation is slower than reflection for the server JVM?)


Field Summary
 
Fields inherited from class org.codehaus.commons.compiler.jdk.ScriptEvaluator
optionalMethodNames, optionalParameterNames, optionalParameterTypes, optionalReturnTypes, optionalStaticMethod, optionalThrownExceptions
 
Fields inherited from interface org.codehaus.commons.compiler.IExpressionEvaluator
ANY_TYPE
 
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
 
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
 
Method Summary
 void cook(java.lang.String[] optionalFileNames, java.io.Reader[] readers)
          Same as ICookable.cook(String, Reader), but cooks a set of scripts into one class.
protected  java.lang.Class<?> getDefaultReturnType()
           
 void setExpressionType(java.lang.Class expressionType)
          Define the type of the expression.
 void setExpressionTypes(java.lang.Class[] expressionTypes)
           
 
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.jdk.ClassBodyEvaluator
cook, getClazz, parseImportDeclarations, setClassName, setDefaultImports, setExtendedClass, setExtendedType, setImplementedInterfaces, setImplementedTypes
 
Methods inherited from class org.codehaus.commons.compiler.jdk.SimpleCompiler
assertCooked, assertNotCooked, cook, getClassLoader, setDebuggingInformation, setParentClassLoader, setParentClassLoader
 
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.IExpressionEvaluator
createFastEvaluator, createFastEvaluator, evaluate
 
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.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, setDebuggingInformation, setParentClassLoader
 

Constructor Detail

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()
Method Detail

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.