Package org.codehaus.janino
Class ClassBodyEvaluator
- java.lang.Object
-
- org.codehaus.commons.compiler.Cookable
-
- org.codehaus.janino.SimpleCompiler
-
- org.codehaus.janino.ClassBodyEvaluator
-
- All Implemented Interfaces:
IClassBodyEvaluator
,ICookable
,ISimpleCompiler
- Direct Known Subclasses:
ScriptEvaluator
public class ClassBodyEvaluator extends SimpleCompiler implements IClassBodyEvaluator
TheoptionalClassLoader
serves two purposes:- It is used to look for classes referenced by the class body.
- It is used to load the generated Java™ class
into the JVM; directly if it is a subclass of
ByteArrayClassLoader
, or by creation of a temporaryByteArrayClassLoader
if not.
-
-
Field Summary
-
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
Constructors Constructor Description ClassBodyEvaluator()
ClassBodyEvaluator(String classBody)
Equivalent toClassBodyEvaluator(String optionalFileName, InputStream is)
Equivalent toClassBodyEvaluator(String optionalFileName, Reader reader)
Equivalent toClassBodyEvaluator(Scanner scanner, ClassLoader optionalParentClassLoader)
Equivalent toClassBodyEvaluator(Scanner scanner, Class optionalExtendedType, Class[] implementedTypes, ClassLoader optionalParentClassLoader)
Equivalent toClassBodyEvaluator(Scanner scanner, String className, Class optionalExtendedType, Class[] implementedTypes, ClassLoader optionalParentClassLoader)
Equivalent to
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Deprecated Methods Modifier and Type Method Description protected Java.PackageMemberClassDeclaration
addPackageMemberClassDeclaration(Location location, Java.CompilationUnit compilationUnit)
To the givenJava.CompilationUnit
, add A class declaration with the configured name, superclass and interfaces A method declaration with the given return type, name, parameter names and values and thrown exceptionsprotected Class
compileToClass(Java.CompilationUnit compilationUnit)
Compile the given compilation unit, load all generated classes, and return the class with the given name.void
cook(Scanner scanner)
Scans, parses and ompiles a given compilation unit from the given scanner.static Object
createFastClassBodyEvaluator(Scanner scanner, Class optionalBaseType, ClassLoader optionalParentClassLoader)
UsecreateInstance(Reader)
instead:static Object
createFastClassBodyEvaluator(Scanner scanner, String className, Class optionalExtendedClass, Class[] implementedInterfaces, ClassLoader optionalParentClassLoader)
Deprecated.UsecreateInstance(Reader)
instead.Object
createInstance(Reader reader)
Scans, parses and compiles a class body from the tokens delivered by the the givenReader
, then creates and returns an instance of that class.Class
getClazz()
Returns the loadedClass
.protected Java.CompilationUnit
makeCompilationUnit(Parser optionalParser)
Create aJava.CompilationUnit
, set the default imports, and parse the import declarations.void
setClassName(String className)
Set the name of the generated class.void
setDefaultImports(String[] optionalDefaultImports)
"Default imports" add to the system import "java.lang", i.e.void
setExtendedClass(Class optionalExtendedType)
Set a particular superclass that the generated class will extend.void
setExtendedType(Class optionalExtendedClass)
Deprecated.void
setImplementedInterfaces(Class[] implementedTypes)
Set a particular set of interfaces that the generated class will implement.void
setImplementedTypes(Class[] implementedInterfaces)
Deprecated.-
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.ICookable
cook, cook, cook, cook, cook, cook, cook, cook, cookFile, cookFile, cookFile, cookFile, setCompileErrorHandler, setDebuggingInformation, setParentClassLoader, setWarningHandler
-
-
-
-
Constructor Detail
-
ClassBodyEvaluator
public ClassBodyEvaluator(String classBody) throws CompileException
Equivalent toClassBodyEvaluator cbe = new ClassBodyEvaluator(); cbe.cook(classBody);
- Throws:
CompileException
- See Also:
ClassBodyEvaluator()
,Cookable.cook(String)
-
ClassBodyEvaluator
public ClassBodyEvaluator(String optionalFileName, InputStream is) throws CompileException, IOException
Equivalent toClassBodyEvaluator cbe = new ClassBodyEvaluator(); cbe.cook(optionalFileName, is);
- Throws:
CompileException
IOException
- See Also:
ClassBodyEvaluator()
,Cookable.cook(String, InputStream)
-
ClassBodyEvaluator
public ClassBodyEvaluator(String optionalFileName, Reader reader) throws CompileException, IOException
Equivalent toClassBodyEvaluator cbe = new ClassBodyEvaluator(); cbe.cook(optionalFileName, reader);
- Throws:
CompileException
IOException
- See Also:
ClassBodyEvaluator()
,Cookable.cook(String, Reader)
-
ClassBodyEvaluator
public ClassBodyEvaluator(Scanner scanner, ClassLoader optionalParentClassLoader) throws CompileException, IOException
Equivalent toClassBodyEvaluator cbe = new ClassBodyEvaluator(); cbe.setParentClassLoader(optionalParentClassLoader); cbe.cook(scanner);
-
ClassBodyEvaluator
public ClassBodyEvaluator(Scanner scanner, Class optionalExtendedType, Class[] implementedTypes, ClassLoader optionalParentClassLoader) throws CompileException, IOException
Equivalent toClassBodyEvaluator cbe = new ClassBodyEvaluator(); cbe.setExtendedType(optionalExtendedType); cbe.setImplementedTypes(implementedTypes); cbe.setParentClassLoader(optionalParentClassLoader); cbe.cook(scanner);
-
ClassBodyEvaluator
public ClassBodyEvaluator(Scanner scanner, String className, Class optionalExtendedType, Class[] implementedTypes, ClassLoader optionalParentClassLoader) throws CompileException, IOException
Equivalent toClassBodyEvaluator cbe = new ClassBodyEvaluator(); cbe.setClassName(className); cbe.setExtendedType(optionalExtendedType); cbe.setImplementedTypes(implementedTypes); cbe.setParentClassLoader(optionalParentClassLoader); cbe.cook(scanner);
-
ClassBodyEvaluator
public ClassBodyEvaluator()
-
-
Method Detail
-
setDefaultImports
public void setDefaultImports(String[] optionalDefaultImports)
Description copied from interface:IClassBodyEvaluator
"Default imports" add to the system import "java.lang", i.e. the evaluator may refer to classes imported by default imports without having to explicitly declare IMPORT statements.Notice that JDK 5 "static imports" are also supported, as shown in the following example.
Example:
sc.setDefaultImports(new String[] { "java.util.Map", // Single type import "java.io.*", // Type-import-on-demand "static java.util.Collections.EMPTY_MAP", // Single static import "static java.util.Collections.*", // Static-import-on-demand });
- Specified by:
setDefaultImports
in interfaceIClassBodyEvaluator
-
setClassName
public void setClassName(String className)
Description copied from interface:IClassBodyEvaluator
Set the name of the generated class. Defaults toIClassBodyEvaluator.DEFAULT_CLASS_NAME
. In most cases, there is no need to set this name, because the generated class is loaded into its ownClassLoader
where its name cannot collide with classes generated by other evaluators.One reason to use this function is to have a class name in a non-default package, which can be relevant when types and members with DEFAULT accessibility are accessed.
- Specified by:
setClassName
in interfaceIClassBodyEvaluator
-
setExtendedClass
public void setExtendedClass(Class optionalExtendedType)
Description copied from interface:IClassBodyEvaluator
Set a particular superclass that the generated class will extend. Ifnull
is passed, the generated class will extendObject
.The common reason to set a base class for an evaluator is that the generated class can directly access the base superclass's (non-private) members.
- Specified by:
setExtendedClass
in interfaceIClassBodyEvaluator
-
setExtendedType
@Deprecated public void setExtendedType(Class optionalExtendedClass)
Deprecated.- Specified by:
setExtendedType
in interfaceIClassBodyEvaluator
-
setImplementedInterfaces
public void setImplementedInterfaces(Class[] implementedTypes)
Description copied from interface:IClassBodyEvaluator
Set a particular set of interfaces that the generated class will implement.- Specified by:
setImplementedInterfaces
in interfaceIClassBodyEvaluator
-
setImplementedTypes
@Deprecated public void setImplementedTypes(Class[] implementedInterfaces)
Deprecated.- Specified by:
setImplementedTypes
in interfaceIClassBodyEvaluator
-
cook
public void cook(Scanner scanner) throws CompileException, IOException
Description copied from class:SimpleCompiler
Scans, parses and ompiles a given compilation unit from the given scanner. After completion,SimpleCompiler.getClassLoader()
returns aClassLoader
that allows for access to the compiled classes.- Overrides:
cook
in classSimpleCompiler
- Throws:
CompileException
IOException
-
makeCompilationUnit
protected final Java.CompilationUnit makeCompilationUnit(Parser optionalParser) throws CompileException, IOException
Create aJava.CompilationUnit
, set the default imports, and parse the import declarations.If the
optionalParser
is given, a sequence of IMPORT directives is parsed from it and added to the compilation unit.- Throws:
CompileException
IOException
-
addPackageMemberClassDeclaration
protected Java.PackageMemberClassDeclaration addPackageMemberClassDeclaration(Location location, Java.CompilationUnit compilationUnit) throws CompileException
To the givenJava.CompilationUnit
, add- A class declaration with the configured name, superclass and interfaces
- A method declaration with the given return type, name, parameter names and values and thrown exceptions
- Returns:
- The created
Java.ClassDeclaration
object - Throws:
CompileException
-
compileToClass
protected final Class compileToClass(Java.CompilationUnit compilationUnit) throws CompileException
Compile the given compilation unit, load all generated classes, and return the class with the given name.- Parameters:
compilationUnit
-- Returns:
- The loaded class
- Throws:
CompileException
-
getClazz
public Class getClazz()
Description copied from interface:IClassBodyEvaluator
Returns the loadedClass
.This method must only be called after exactly one of the
ICookable.cook(String, java.io.Reader)
methods was called.- Specified by:
getClazz
in interfaceIClassBodyEvaluator
-
createInstance
public Object createInstance(Reader reader) throws CompileException, IOException
Description copied from interface:IClassBodyEvaluator
Scans, parses and compiles a class body from the tokens delivered by the the givenReader
, then creates and returns an instance of that class.- Specified by:
createInstance
in interfaceIClassBodyEvaluator
- Parameters:
reader
- Source of class body tokens- Returns:
- An object that extends the
optionalExtendedType
and implements the givenimplementedTypes
- Throws:
CompileException
IOException
-
createFastClassBodyEvaluator
public static Object createFastClassBodyEvaluator(Scanner scanner, Class optionalBaseType, ClassLoader optionalParentClassLoader) throws CompileException, IOException
UsecreateInstance(Reader)
instead:IClassBodyEvaluator cbe =
CompilerFactoryFactory
.getDefaultCompilerFactory
().newClassBodyEvaluator
(); if (optionalBaseType != null) { if (optionalBaseType.isInterface()) { cbe.setImplementedInterfaces
(new Class[] { optionalBaseType }); } else { cbe.setExtendedClass
(optionalBaseType); } } cbe.setParentClassLoader
(optionalParentClassLoader); cbe.createInstance
(reader);- Throws:
CompileException
IOException
- See Also:
createInstance(Reader)
-
createFastClassBodyEvaluator
@Deprecated public static Object createFastClassBodyEvaluator(Scanner scanner, String className, Class optionalExtendedClass, Class[] implementedInterfaces, ClassLoader optionalParentClassLoader) throws CompileException, IOException
Deprecated.UsecreateInstance(Reader)
instead.UsecreateInstance(Reader)
instead:IClassBodyEvaluator cbe =
CompilerFactoryFactory
.getDefaultCompilerFactory
().newClassBodyEvaluator
(); cbe.setExtendedClass
(optionalExtendedClass); cbe.setImplementedInterfaces
(implementedInterfaces); cbe.setParentClassLoader
(optionalParentClassLoader); cbe.createInstance
(reader);- Throws:
CompileException
IOException
- See Also:
createInstance(Reader)
-
-