|
||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Objectorg.codehaus.commons.compiler.Cookable
org.codehaus.commons.compiler.jdk.SimpleCompiler
org.codehaus.commons.compiler.jdk.ClassBodyEvaluator
org.codehaus.commons.compiler.jdk.ScriptEvaluator
public class ScriptEvaluator
To set up a ScriptEvaluator
object, proceed as described for IScriptEvaluator
.
Alternatively, a number of "convenience constructors" exist that execute the described steps
instantly.
Alternatively, a number of "convenience constructors" exist that execute the steps described above instantly. Their use is discouraged.
Notice that this implementation of IClassBodyEvaluator
is prone to "Java
injection", i.e. an application could get more than one class body compiled by passing a
bogus input document.
Also notice that the parsing of leading IMPORT declarations is heuristic and has certain
limitations; see ClassBodyEvaluator.parseImportDeclarations(Reader)
.
Field Summary | |
---|---|
protected java.lang.String[] |
optionalMethodNames
|
protected java.lang.String[][] |
optionalParameterNames
|
protected java.lang.Class<?>[][] |
optionalParameterTypes
|
protected java.lang.Class<?>[] |
optionalReturnTypes
|
protected boolean[] |
optionalStaticMethod
|
protected java.lang.Class<?>[][] |
optionalThrownExceptions
|
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 | |
---|---|
ScriptEvaluator()
|
|
ScriptEvaluator(java.lang.String script)
Equivalent to |
|
ScriptEvaluator(java.lang.String script,
java.lang.Class<?> returnType)
Equivalent to |
|
ScriptEvaluator(java.lang.String script,
java.lang.Class<?> returnType,
java.lang.String[] parameterNames,
java.lang.Class<?>[] parameterTypes)
Equivalent to |
|
ScriptEvaluator(java.lang.String script,
java.lang.Class<?> returnType,
java.lang.String[] parameterNames,
java.lang.Class<?>[] parameterTypes,
java.lang.Class<?>[] thrownExceptions)
Equivalent to |
|
ScriptEvaluator(java.lang.String optionalFileName,
java.io.InputStream is,
java.lang.Class<?> returnType,
java.lang.String[] parameterNames,
java.lang.Class<?>[] parameterTypes,
java.lang.Class<?>[] thrownExceptions,
java.lang.ClassLoader optionalParentClassLoader)
Equivalent to |
|
ScriptEvaluator(java.lang.String optionalFileName,
java.io.Reader reader,
java.lang.Class<?> returnType,
java.lang.String[] parameterNames,
java.lang.Class<?>[] parameterTypes,
java.lang.Class<?>[] thrownExceptions,
java.lang.ClassLoader optionalParentClassLoader)
Equivalent to |
Method Summary | |
---|---|
void |
cook(java.io.Reader[] readers)
Same as ICookable.cook(Reader) , but for multiple scripts. |
void |
cook(java.lang.String[] strings)
Same as ICookable.cook(String) , but for multiple scripts. |
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 void |
cook(java.lang.String[] optionalFileNames,
java.io.Reader[] readers,
java.lang.String[] imports)
|
void |
cook(java.lang.String[] optionalFileNames,
java.lang.String[] strings)
Same as ICookable.cook(String, String) , but for multiple scripts. |
void |
cook(java.lang.String optionalFileName,
java.io.Reader r)
Reads, scans, parses and compiles Java tokens from the given Reader . |
java.lang.Object |
createFastEvaluator(java.io.Reader r,
java.lang.Class interfaceToImplement,
java.lang.String[] parameterNames)
If the parameter and return types of the expression are known at compile time, then a "fast" script evaluator can be instantiated through this method. |
java.lang.Object |
createFastEvaluator(java.lang.String script,
java.lang.Class interfaceToImplement,
java.lang.String[] parameterNames)
|
java.lang.Object |
createInstance(java.io.Reader reader)
Don't use. |
java.lang.Object |
evaluate(int idx,
java.lang.Object[] arguments)
Same as IScriptEvaluator.evaluate(Object[]) , but for multiple scripts. |
java.lang.Object |
evaluate(java.lang.Object[] arguments)
Calls the script with concrete parameter values. |
protected java.lang.Class<?> |
getDefaultReturnType()
|
java.lang.reflect.Method |
getMethod()
Returns the loaded Method . |
java.lang.reflect.Method |
getMethod(int idx)
Same as IScriptEvaluator.getMethod() , but for multiple scripts. |
void |
setMethodName(java.lang.String methodName)
Define the name of the generated method. |
void |
setMethodNames(java.lang.String[] methodNames)
Same as IScriptEvaluator.setMethodName(String) , but for multiple scripts. |
void |
setParameters(java.lang.String[][] names,
java.lang.Class[][] types)
Same as IScriptEvaluator.setParameters(String[], Class[]) , but for multiple scripts. |
void |
setParameters(java.lang.String[] names,
java.lang.Class[] types)
Define the names and types of the parameters of the generated method. |
void |
setReturnType(java.lang.Class returnType)
Define the return type of the generated method. |
void |
setReturnTypes(java.lang.Class[] returnTypes)
Same as IScriptEvaluator.setReturnType(Class) , but for multiple scripts. |
void |
setStaticMethod(boolean staticMethod)
Define whether the generated method should be STATIC or not. |
void |
setStaticMethod(boolean[] staticMethod)
Same as IScriptEvaluator.setStaticMethod(boolean) , but for multiple scripts. |
void |
setThrownExceptions(java.lang.Class[] thrownExceptions)
Define the exceptions that the generated method may throw. |
void |
setThrownExceptions(java.lang.Class[][] thrownExceptions)
Same as IScriptEvaluator.setThrownExceptions(Class[]) , but for multiple scripts. |
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.IClassBodyEvaluator |
---|
getClazz, setClassName, setDefaultImports, setExtendedClass, setExtendedType, setImplementedInterfaces, setImplementedTypes |
Methods inherited from interface org.codehaus.commons.compiler.ICookable |
---|
cook, cook, cook, cook, cook, cook, cook, cookFile, cookFile, cookFile, cookFile, setDebuggingInformation, setParentClassLoader |
Field Detail |
---|
protected boolean[] optionalStaticMethod
protected java.lang.Class<?>[] optionalReturnTypes
protected java.lang.String[] optionalMethodNames
protected java.lang.String[][] optionalParameterNames
protected java.lang.Class<?>[][] optionalParameterTypes
protected java.lang.Class<?>[][] optionalThrownExceptions
Constructor Detail |
---|
public ScriptEvaluator(java.lang.String script) throws CompileException
ScriptEvaluator se = new ScriptEvaluator(); se.cook(script);
CompileException
ScriptEvaluator()
,
Cookable.cook(String)
public ScriptEvaluator(java.lang.String script, java.lang.Class<?> returnType) throws CompileException
ScriptEvaluator se = new ScriptEvaluator(); se.setReturnType(returnType); se.cook(script);
CompileException
ScriptEvaluator()
,
setReturnType(Class)
,
Cookable.cook(String)
public ScriptEvaluator(java.lang.String script, java.lang.Class<?> returnType, java.lang.String[] parameterNames, java.lang.Class<?>[] parameterTypes) throws CompileException
ScriptEvaluator se = new ScriptEvaluator(); se.setReturnType(returnType); se.setParameters(parameterNames, parameterTypes); se.cook(script);
CompileException
ScriptEvaluator()
,
setReturnType(Class)
,
setParameters(String[], Class[])
,
Cookable.cook(String)
public ScriptEvaluator(java.lang.String script, java.lang.Class<?> returnType, java.lang.String[] parameterNames, java.lang.Class<?>[] parameterTypes, java.lang.Class<?>[] thrownExceptions) throws CompileException
ScriptEvaluator se = new ScriptEvaluator(); se.setReturnType(returnType); se.setParameters(parameterNames, parameterTypes); se.setThrownExceptions(thrownExceptions); se.cook(script);
CompileException
ScriptEvaluator()
,
setReturnType(Class)
,
setParameters(String[], Class[])
,
setThrownExceptions(Class[])
,
Cookable.cook(String)
public ScriptEvaluator(java.lang.String optionalFileName, java.io.InputStream is, java.lang.Class<?> returnType, java.lang.String[] parameterNames, java.lang.Class<?>[] parameterTypes, java.lang.Class<?>[] thrownExceptions, java.lang.ClassLoader optionalParentClassLoader) throws CompileException, java.io.IOException
ScriptEvaluator se = new ScriptEvaluator(); se.setReturnType(returnType); se.setParameters(parameterNames, parameterTypes); se.setThrownExceptions(thrownExceptions); se.setParentClassLoader(optionalParentClassLoader); se.cook(optionalFileName, is);
CompileException
java.io.IOException
ScriptEvaluator()
,
setReturnType(Class)
,
setParameters(String[], Class[])
,
setThrownExceptions(Class[])
,
SimpleCompiler.setParentClassLoader(ClassLoader)
,
Cookable.cook(String, InputStream)
public ScriptEvaluator(java.lang.String optionalFileName, java.io.Reader reader, java.lang.Class<?> returnType, java.lang.String[] parameterNames, java.lang.Class<?>[] parameterTypes, java.lang.Class<?>[] thrownExceptions, java.lang.ClassLoader optionalParentClassLoader) throws CompileException, java.io.IOException
ScriptEvaluator se = new ScriptEvaluator(); se.setReturnType(returnType); se.setParameters(parameterNames, parameterTypes); se.setThrownExceptions(thrownExceptions); se.setParentClassLoader(optionalParentClassLoader); se.cook(reader);
CompileException
java.io.IOException
ScriptEvaluator()
,
setReturnType(Class)
,
setParameters(String[], Class[])
,
setThrownExceptions(Class[])
,
SimpleCompiler.setParentClassLoader(ClassLoader)
,
Cookable.cook(String, Reader)
public ScriptEvaluator()
Method Detail |
---|
public void setStaticMethod(boolean staticMethod)
IScriptEvaluator
true
.
setStaticMethod
in interface IScriptEvaluator
public void setReturnType(java.lang.Class returnType)
IScriptEvaluator
void.class
.
setReturnType
in interface IScriptEvaluator
public void setMethodName(java.lang.String methodName)
IScriptEvaluator
setMethodName
in interface IScriptEvaluator
public void setParameters(java.lang.String[] names, java.lang.Class[] types)
IScriptEvaluator
names
and types
must have the same number of elements.
The parameters can be of primitive type, e.g. double.class
.
setParameters
in interface IScriptEvaluator
public void setThrownExceptions(java.lang.Class[] thrownExceptions)
IScriptEvaluator
setThrownExceptions
in interface IScriptEvaluator
public void cook(java.lang.String optionalFileName, java.io.Reader r) throws CompileException, java.io.IOException
ICookable
Reader
.
cook
in interface ICookable
cook
in class ClassBodyEvaluator
optionalFileName
- Used when reporting errors and warnings.
CompileException
java.io.IOException
public java.lang.Object evaluate(java.lang.Object[] arguments) throws java.lang.reflect.InvocationTargetException
IScriptEvaluator
Each argument must have the same type as specified through the parameterTypes
parameter of IScriptEvaluator.setParameters(String[], Class[])
.
Arguments of primitive type must passed with their wrapper class objects.
The object returned has the class as specified through IScriptEvaluator.setReturnType(Class)
.
This method is thread-safe.
evaluate
in interface IScriptEvaluator
arguments
- The actual parameter values
java.lang.reflect.InvocationTargetException
public java.lang.reflect.Method getMethod()
IScriptEvaluator
Method
.
This method must only be called after exactly one of the ICookable.cook(String, Reader)
methods was called.
getMethod
in interface IScriptEvaluator
public void setStaticMethod(boolean[] staticMethod)
IScriptEvaluator
IScriptEvaluator.setStaticMethod(boolean)
, but for multiple scripts.
setStaticMethod
in interface IScriptEvaluator
public void setReturnTypes(java.lang.Class[] returnTypes)
IScriptEvaluator
IScriptEvaluator.setReturnType(Class)
, but for multiple scripts.
setReturnTypes
in interface IScriptEvaluator
public void setMethodNames(java.lang.String[] methodNames)
IScriptEvaluator
IScriptEvaluator.setMethodName(String)
, but for multiple scripts.
Define the names of the generated methods. By default the methods have distinct and implementation-specific names.
If two scripts have the same name, then they must have different parameter types
(see IScriptEvaluator.setParameters(String[][], Class[][])
).
setMethodNames
in interface IScriptEvaluator
public void setParameters(java.lang.String[][] names, java.lang.Class[][] types)
IScriptEvaluator
IScriptEvaluator.setParameters(String[], Class[])
, but for multiple scripts.
setParameters
in interface IScriptEvaluator
public void setThrownExceptions(java.lang.Class[][] thrownExceptions)
IScriptEvaluator
IScriptEvaluator.setThrownExceptions(Class[])
, but for multiple scripts.
setThrownExceptions
in interface IScriptEvaluator
public final void cook(java.io.Reader[] readers) throws CompileException, java.io.IOException
IScriptEvaluator
ICookable.cook(Reader)
, but for multiple scripts.
cook
in interface IScriptEvaluator
CompileException
java.io.IOException
public void cook(java.lang.String[] optionalFileNames, java.io.Reader[] readers) throws CompileException, java.io.IOException
IScriptEvaluator
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.
cook
in interface IScriptEvaluator
CompileException
java.io.IOException
public final void cook(java.lang.String[] strings) throws CompileException
IScriptEvaluator
ICookable.cook(String)
, but for multiple scripts.
cook
in interface IScriptEvaluator
CompileException
public void cook(java.lang.String[] optionalFileNames, java.lang.String[] strings) throws CompileException
IScriptEvaluator
ICookable.cook(String, String)
, but for multiple scripts.
cook
in interface IScriptEvaluator
CompileException
protected final void cook(java.lang.String[] optionalFileNames, java.io.Reader[] readers, java.lang.String[] imports) throws CompileException, java.io.IOException
readers
- The scripts to cook
CompileException
java.io.IOException
protected java.lang.Class<?> getDefaultReturnType()
public java.lang.Object createFastEvaluator(java.lang.String script, java.lang.Class interfaceToImplement, java.lang.String[] parameterNames) throws CompileException
createFastEvaluator
in interface IScriptEvaluator
script
- Contains the sequence of script tokens
CompileException
createFastEvaluator(String, Class, String[])
public final java.lang.Object createInstance(java.io.Reader reader)
createInstance
in interface IClassBodyEvaluator
createInstance
in class ClassBodyEvaluator
reader
- Source of class body tokens
optionalExtendedType
and implements the given
implementedTypes
public java.lang.Object createFastEvaluator(java.io.Reader r, java.lang.Class interfaceToImplement, java.lang.String[] parameterNames) throws CompileException, java.io.IOException
IScriptEvaluator
Script evaluation is faster than through IScriptEvaluator.evaluate(Object[])
, because it is not done
through reflection but through direct method invocation.
Example:
public interface Foo { int bar(int a, int b); } ... IScriptEvaluator se =All other configuration (implemented type, static method, return type, method name, parameter names and types, thrown exceptions) are predetermined by theCompilerFactoryFactory
.getDefaultCompilerFactory
().newScriptEvaluator
(); // Optionally configure the SE her: se.setClassName
("Bar"); se.setDefaultImports
(new String[] { "java.util.*" }); se.setExtendedClass
(SomeOtherClass.class); se.setParentClassLoader
(someClassLoader); Foo f = (Foo) se.createFastScriptEvaluator
( "return a - b;", Foo.class, new String[] { "a", "b" } ); System.out.println("1 - 2 = " + f.bar(1, 2));
interfaceToImplement
.
Notice: The interfaceToImplement
must either be declared public
,
or with package scope in the same package as the generated class (see IClassBodyEvaluator.setClassName(String)
).
createFastEvaluator
in interface IScriptEvaluator
r
- Produces the stream of script tokensinterfaceToImplement
- Must declare exactly one methodparameterNames
- The names of the parameters of that method
CompileException
java.io.IOException
public java.lang.Object evaluate(int idx, java.lang.Object[] arguments) throws java.lang.reflect.InvocationTargetException
IScriptEvaluator
IScriptEvaluator.evaluate(Object[])
, but for multiple scripts.
evaluate
in interface IScriptEvaluator
java.lang.reflect.InvocationTargetException
public java.lang.reflect.Method getMethod(int idx)
IScriptEvaluator
IScriptEvaluator.getMethod()
, but for multiple scripts.
getMethod
in interface IScriptEvaluator
|
||||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | |||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |