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
TheoptionalClassLoaderserves 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 temporaryByteArrayClassLoaderif not.
-
-
Field Summary
Fields Modifier and Type Field Description protected java.lang.StringclassNameprotected static java.lang.Class[]ZERO_CLASSES-
Fields inherited from class org.codehaus.janino.SimpleCompiler
debugLines, debugSource, debugVars
-
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(java.lang.String classBody)Equivalent toClassBodyEvaluator(java.lang.String optionalFileName, java.io.InputStream is)Equivalent toClassBodyEvaluator(java.lang.String optionalFileName, java.io.Reader reader)Equivalent toClassBodyEvaluator(Scanner scanner, java.lang.ClassLoader optionalParentClassLoader)Equivalent toClassBodyEvaluator(Scanner scanner, java.lang.Class optionalExtendedType, java.lang.Class[] implementedTypes, java.lang.ClassLoader optionalParentClassLoader)Equivalent toClassBodyEvaluator(Scanner scanner, java.lang.String className, java.lang.Class optionalExtendedType, java.lang.Class[] implementedTypes, java.lang.ClassLoader optionalParentClassLoader)Equivalent to
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Deprecated Methods Modifier and Type Method Description protected Java.PackageMemberClassDeclarationaddPackageMemberClassDeclaration(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 java.lang.ClasscompileToClass(Java.CompilationUnit compilationUnit, java.lang.String newClassName)Compile the given compilation unit, load all generated classes, and return the class with the given name.voidcook(Scanner scanner)Scans, parses and ompiles a given compilation unit from the given scanner.static java.lang.ObjectcreateFastClassBodyEvaluator(Scanner scanner, java.lang.Class optionalBaseType, java.lang.ClassLoader optionalParentClassLoader)UsecreateInstance(Reader)instead:static java.lang.ObjectcreateFastClassBodyEvaluator(Scanner scanner, java.lang.String className, java.lang.Class optionalExtendedClass, java.lang.Class[] implementedInterfaces, java.lang.ClassLoader optionalParentClassLoader)Deprecated.java.lang.ObjectcreateInstance(java.io.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.java.lang.ClassgetClazz()Returns the loadedClass.protected Java.CompilationUnitmakeCompilationUnit(Parser optionalParser)Create aJava.CompilationUnit, set the default imports, and parse the import declarations.voidsetClassName(java.lang.String className)Set the name of the generated class.voidsetDefaultImports(java.lang.String[] optionalDefaultImports)"Default imports" add to the system import "java.lang", i.e.voidsetExtendedClass(java.lang.Class optionalExtendedType)Set a particular superclass that the generated class will extend.voidsetExtendedType(java.lang.Class optionalExtendedClass)Deprecated.voidsetImplementedInterfaces(java.lang.Class[] implementedTypes)Set a particular set of interfaces that the generated class will implement.voidsetImplementedTypes(java.lang.Class[] implementedInterfaces)Deprecated.-
Methods inherited from class org.codehaus.janino.SimpleCompiler
assertNotCooked, classesToTypes, classToType, compileToClassLoader, cook, cook, equals, getClassLoader, hashCode, main, setDebuggingInformation, setParentClassLoader
-
Methods inherited from class org.codehaus.commons.compiler.Cookable
cook, cook, cook, cook, cook, cook, cook, cookFile, cookFile, cookFile, cookFile, readString
-
-
-
-
Constructor Detail
-
ClassBodyEvaluator
public ClassBodyEvaluator(java.lang.String classBody) throws CompileExceptionEquivalent toClassBodyEvaluator cbe = new ClassBodyEvaluator(); cbe.cook(classBody);
- Throws:
CompileException- See Also:
ClassBodyEvaluator(),Cookable.cook(String)
-
ClassBodyEvaluator
public ClassBodyEvaluator(java.lang.String optionalFileName, java.io.InputStream is) throws CompileException, java.io.IOExceptionEquivalent toClassBodyEvaluator cbe = new ClassBodyEvaluator(); cbe.cook(optionalFileName, is);
- Throws:
CompileExceptionjava.io.IOException- See Also:
ClassBodyEvaluator(),Cookable.cook(String, InputStream)
-
ClassBodyEvaluator
public ClassBodyEvaluator(java.lang.String optionalFileName, java.io.Reader reader) throws CompileException, java.io.IOExceptionEquivalent toClassBodyEvaluator cbe = new ClassBodyEvaluator(); cbe.cook(optionalFileName, reader);
- Throws:
CompileExceptionjava.io.IOException- See Also:
ClassBodyEvaluator(),Cookable.cook(String, Reader)
-
ClassBodyEvaluator
public ClassBodyEvaluator(Scanner scanner, java.lang.ClassLoader optionalParentClassLoader) throws CompileException, java.io.IOException
Equivalent toClassBodyEvaluator cbe = new ClassBodyEvaluator(); cbe.setParentClassLoader(optionalParentClassLoader); cbe.cook(scanner);
- Throws:
CompileExceptionjava.io.IOException- See Also:
ClassBodyEvaluator(),SimpleCompiler.setParentClassLoader(ClassLoader),Cookable.cook(Reader)
-
ClassBodyEvaluator
public ClassBodyEvaluator(Scanner scanner, java.lang.Class optionalExtendedType, java.lang.Class[] implementedTypes, java.lang.ClassLoader optionalParentClassLoader) throws CompileException, java.io.IOException
Equivalent toClassBodyEvaluator cbe = new ClassBodyEvaluator(); cbe.setExtendedType(optionalExtendedType); cbe.setImplementedTypes(implementedTypes); cbe.setParentClassLoader(optionalParentClassLoader); cbe.cook(scanner);
- Throws:
CompileExceptionjava.io.IOException- See Also:
ClassBodyEvaluator(),setExtendedClass(Class),setImplementedInterfaces(Class[]),SimpleCompiler.setParentClassLoader(ClassLoader),Cookable.cook(Reader)
-
ClassBodyEvaluator
public ClassBodyEvaluator(Scanner scanner, java.lang.String className, java.lang.Class optionalExtendedType, java.lang.Class[] implementedTypes, java.lang.ClassLoader optionalParentClassLoader) throws CompileException, java.io.IOException
Equivalent toClassBodyEvaluator cbe = new ClassBodyEvaluator(); cbe.setClassName(className); cbe.setExtendedType(optionalExtendedType); cbe.setImplementedTypes(implementedTypes); cbe.setParentClassLoader(optionalParentClassLoader); cbe.cook(scanner);
- Throws:
CompileExceptionjava.io.IOException- See Also:
ClassBodyEvaluator(),setClassName(String),setExtendedClass(Class),setImplementedInterfaces(Class[]),SimpleCompiler.setParentClassLoader(ClassLoader),Cookable.cook(Reader)
-
ClassBodyEvaluator
public ClassBodyEvaluator()
-
-
Method Detail
-
setDefaultImports
public void setDefaultImports(java.lang.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:
setDefaultImportsin interfaceIClassBodyEvaluator
-
setClassName
public void setClassName(java.lang.String className)
Description copied from interface:IClassBodyEvaluatorSet 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 ownClassLoaderwhere 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:
setClassNamein interfaceIClassBodyEvaluator
-
setExtendedClass
public void setExtendedClass(java.lang.Class optionalExtendedType)
Description copied from interface:IClassBodyEvaluatorSet a particular superclass that the generated class will extend. Ifnullis 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:
setExtendedClassin interfaceIClassBodyEvaluator
-
setExtendedType
@Deprecated public void setExtendedType(java.lang.Class optionalExtendedClass)
Deprecated.- Specified by:
setExtendedTypein interfaceIClassBodyEvaluator
-
setImplementedInterfaces
public void setImplementedInterfaces(java.lang.Class[] implementedTypes)
Description copied from interface:IClassBodyEvaluatorSet a particular set of interfaces that the generated class will implement.- Specified by:
setImplementedInterfacesin interfaceIClassBodyEvaluator
-
setImplementedTypes
@Deprecated public void setImplementedTypes(java.lang.Class[] implementedInterfaces)
Deprecated.- Specified by:
setImplementedTypesin interfaceIClassBodyEvaluator
-
cook
public void cook(Scanner scanner) throws CompileException, java.io.IOException
Description copied from class:SimpleCompilerScans, parses and ompiles a given compilation unit from the given scanner. After completion,SimpleCompiler.getClassLoader()returns aClassLoaderthat allows for access to the compiled classes.- Overrides:
cookin classSimpleCompiler- Throws:
CompileExceptionjava.io.IOException
-
makeCompilationUnit
protected final Java.CompilationUnit makeCompilationUnit(Parser optionalParser) throws CompileException, java.io.IOException
Create aJava.CompilationUnit, set the default imports, and parse the import declarations.If the
optionalParseris given, a sequence of IMPORT directives is parsed from it and added to the compilation unit.- Throws:
CompileExceptionjava.io.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.ClassDeclarationobject - Throws:
CompileException
-
compileToClass
protected final java.lang.Class compileToClass(Java.CompilationUnit compilationUnit, java.lang.String newClassName) throws CompileException
Compile the given compilation unit, load all generated classes, and return the class with the given name.- Parameters:
compilationUnit-newClassName- The fully qualified class name- Returns:
- The loaded class
- Throws:
CompileException
-
getClazz
public java.lang.Class getClazz()
Description copied from interface:IClassBodyEvaluatorReturns the loadedClass.This method must only be called after exactly one of the
ICookable.cook(String, java.io.Reader)methods was called.- Specified by:
getClazzin interfaceIClassBodyEvaluator
-
createInstance
public java.lang.Object createInstance(java.io.Reader reader) throws CompileException, java.io.IOExceptionDescription copied from interface:IClassBodyEvaluatorScans, 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:
createInstancein interfaceIClassBodyEvaluator- Parameters:
reader- Source of class body tokens- Returns:
- An object that extends the
optionalExtendedTypeand implements the givenimplementedTypes - Throws:
CompileExceptionjava.io.IOException
-
createFastClassBodyEvaluator
public static java.lang.Object createFastClassBodyEvaluator(Scanner scanner, java.lang.Class optionalBaseType, java.lang.ClassLoader optionalParentClassLoader) throws CompileException, java.io.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:
CompileExceptionjava.io.IOException- See Also:
createInstance(Reader)
-
createFastClassBodyEvaluator
@Deprecated public static java.lang.Object createFastClassBodyEvaluator(Scanner scanner, java.lang.String className, java.lang.Class optionalExtendedClass, java.lang.Class[] implementedInterfaces, java.lang.ClassLoader optionalParentClassLoader) throws CompileException, java.io.IOException
Deprecated.UsecreateInstance(Reader)instead:IClassBodyEvaluator cbe =
CompilerFactoryFactory.getDefaultCompilerFactory().newClassBodyEvaluator(); cbe.setExtendedClass(optionalExtendedClass); cbe.setImplementedInterfaces(implementedInterfaces); cbe.setParentClassLoader(optionalParentClassLoader); cbe.createInstance(reader);- Throws:
CompileExceptionjava.io.IOException- See Also:
createInstance(Reader)
-
-