Package org.codehaus.janino
Class JavaSourceClassLoader
- java.lang.Object
-
- java.lang.ClassLoader
-
- org.codehaus.commons.compiler.AbstractJavaSourceClassLoader
-
- org.codehaus.janino.JavaSourceClassLoader
-
- Direct Known Subclasses:
CachingJavaSourceClassLoader
public class JavaSourceClassLoader extends AbstractJavaSourceClassLoader
AClassLoaderthat, unlike usualClassLoaders, does not load byte code, but reads Java source code and then scans, parses, compiles and loads it into the virtual machine.As with any
ClassLoader, it is not possible to "update" classes after they've been loaded. The way to achieve this is to give up on theJavaSourceClassLoaderand create a new one.Notice that this class loader does not support resoures in the sense of
ClassLoader.getResource(String),ClassLoader.getResourceAsStream(String)ndClassLoader.getResources(String).- See Also:
ClassLoaders
-
-
Nested Class Summary
-
Nested classes/interfaces inherited from class org.codehaus.commons.compiler.AbstractJavaSourceClassLoader
AbstractJavaSourceClassLoader.ProtectionDomainFactory
-
-
Field Summary
Fields Modifier and Type Field Description private java.util.Set<UnitCompiler>compiledUnitCompilersprivate booleandebugLinesprivate booleandebugSourceprivate booleandebugVarsprivate JavaSourceIClassLoaderiClassLoaderprivate java.util.Map<java.lang.String,byte[]>precompiledClassesThisMapkeeps those classes which were already compiled, but not yet defined i.e.-
Fields inherited from class org.codehaus.commons.compiler.AbstractJavaSourceClassLoader
protectionDomainFactory
-
-
Constructor Summary
Constructors Constructor Description JavaSourceClassLoader()JavaSourceClassLoader(java.lang.ClassLoader parentClassLoader)JavaSourceClassLoader(java.lang.ClassLoader parentClassLoader, java.io.File[] sourcePath, java.lang.String characterEncoding)Sets up aJavaSourceClassLoaderthat finds Java source code in a file that resides in either of the directories specified by the given source path.JavaSourceClassLoader(java.lang.ClassLoader parentClassLoader, ResourceFinder sourceFinder, java.lang.String characterEncoding)Constructs aJavaSourceClassLoaderthat finds Java source code through a givenResourceFinder.JavaSourceClassLoader(java.lang.ClassLoader parentClassLoader, JavaSourceIClassLoader iClassLoader)Constructs aJavaSourceClassLoaderthat finds classes through anJavaSourceIClassLoader.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description private java.lang.Class<?>defineBytecode(java.lang.String className, byte[] ba)protected java.lang.Class<?>findClass(java.lang.String name)Implementation ofClassLoader.findClass(String).protected java.util.Map<java.lang.String,byte[]>generateBytecodes(java.lang.String name)Finds, scans, parses the right compilation unit.voidsetCompileErrorHandler(ErrorHandler compileErrorHandler)voidsetDebuggingInfo(boolean debugSource, boolean debugLines, boolean debugVars)voidsetSourceCharset(java.nio.charset.Charset charset)voidsetSourceFinder(ResourceFinder sourceFinder)voidsetSourcePath(java.io.File[] sourcePath)voidsetTargetVersion(int version)voidsetWarningHandler(WarningHandler warningHandler)-
Methods inherited from class org.codehaus.commons.compiler.AbstractJavaSourceClassLoader
getResourceAsStream, main, setProtectionDomainFactory, setSourceFileCharacterEncoding
-
Methods inherited from class java.lang.ClassLoader
clearAssertionStatus, defineClass, defineClass, defineClass, defineClass, definePackage, findClass, findLibrary, findLoadedClass, findResource, findResource, findResources, findSystemClass, getClassLoadingLock, getDefinedPackage, getDefinedPackages, getName, getPackage, getPackages, getParent, getPlatformClassLoader, getResource, getResources, getSystemClassLoader, getSystemResource, getSystemResourceAsStream, getSystemResources, getUnnamedModule, isRegisteredAsParallelCapable, loadClass, loadClass, registerAsParallelCapable, resolveClass, resources, setClassAssertionStatus, setDefaultAssertionStatus, setPackageAssertionStatus, setSigners
-
-
-
-
Field Detail
-
compiledUnitCompilers
private final java.util.Set<UnitCompiler> compiledUnitCompilers
-
precompiledClasses
private final java.util.Map<java.lang.String,byte[]> precompiledClasses
ThisMapkeeps those classes which were already compiled, but not yet defined i.e. which were not yet passed toClassLoader.defineClass(java.lang.String, byte[], int, int).
-
iClassLoader
private final JavaSourceIClassLoader iClassLoader
-
debugSource
private boolean debugSource
-
debugLines
private boolean debugLines
-
debugVars
private boolean debugVars
-
-
Constructor Detail
-
JavaSourceClassLoader
public JavaSourceClassLoader()
-
JavaSourceClassLoader
public JavaSourceClassLoader(java.lang.ClassLoader parentClassLoader)
-
JavaSourceClassLoader
public JavaSourceClassLoader(java.lang.ClassLoader parentClassLoader, @Nullable java.io.File[] sourcePath, @Nullable java.lang.String characterEncoding)Sets up aJavaSourceClassLoaderthat finds Java source code in a file that resides in either of the directories specified by the given source path.- Parameters:
parentClassLoader- SeeClassLoadersourcePath- A collection of directories that are searched for Java source files in the given ordercharacterEncoding- The encoding of the Java source files (nullfor platform default encoding)
-
JavaSourceClassLoader
public JavaSourceClassLoader(java.lang.ClassLoader parentClassLoader, ResourceFinder sourceFinder, @Nullable java.lang.String characterEncoding)Constructs aJavaSourceClassLoaderthat finds Java source code through a givenResourceFinder.You can specify to include certain debugging information in the generated class files, which is useful if you want to debug through the generated classes (see
Scanner(String, Reader)).- Parameters:
parentClassLoader- SeeClassLoadersourceFinder- Used to locate additional source filescharacterEncoding- The encoding of the Java source files (nullfor platform default encoding)
-
JavaSourceClassLoader
public JavaSourceClassLoader(java.lang.ClassLoader parentClassLoader, JavaSourceIClassLoader iClassLoader)Constructs aJavaSourceClassLoaderthat finds classes through anJavaSourceIClassLoader.
-
-
Method Detail
-
setSourcePath
public void setSourcePath(java.io.File[] sourcePath)
- Specified by:
setSourcePathin classAbstractJavaSourceClassLoader- Parameters:
sourcePath- The sequence of directories to search for Java source files
-
setSourceFinder
public void setSourceFinder(ResourceFinder sourceFinder)
- Specified by:
setSourceFinderin classAbstractJavaSourceClassLoader- Parameters:
sourceFinder- Is used when searching for Java source files
-
setSourceCharset
public void setSourceCharset(java.nio.charset.Charset charset)
- Specified by:
setSourceCharsetin classAbstractJavaSourceClassLoader- Parameters:
charset- The character set to using when reading characters from a source file
-
setDebuggingInfo
public void setDebuggingInfo(boolean debugSource, boolean debugLines, boolean debugVars)- Specified by:
setDebuggingInfoin classAbstractJavaSourceClassLoader- Parameters:
debugSource- Whether line number debugging information should be generateddebugLines- Whether variables debugging information should be generateddebugVars- Whether source file debugging information should be generated
-
setTargetVersion
public void setTargetVersion(int version)
-
setCompileErrorHandler
public void setCompileErrorHandler(@Nullable ErrorHandler compileErrorHandler)
-
setWarningHandler
public void setWarningHandler(@Nullable WarningHandler warningHandler)
-
findClass
protected java.lang.Class<?> findClass(@Nullable java.lang.String name) throws java.lang.ClassNotFoundException
Implementation ofClassLoader.findClass(String).- Overrides:
findClassin classjava.lang.ClassLoader- Throws:
java.lang.ClassNotFoundException
-
generateBytecodes
@Nullable protected java.util.Map<java.lang.String,byte[]> generateBytecodes(java.lang.String name) throws java.lang.ClassNotFoundException
Finds, scans, parses the right compilation unit. Compile the parsed compilation unit to bytecode. This may cause more compilation units being scanned and parsed. Continue until all compilation units are compiled.- Returns:
- String name => byte[] bytecode, or
nullif no source code could be found - Throws:
java.lang.ClassNotFoundException- on compilation problems
-
defineBytecode
private java.lang.Class<?> defineBytecode(java.lang.String className, byte[] ba)- Throws:
java.lang.ClassFormatError- See Also:
AbstractJavaSourceClassLoader.setProtectionDomainFactory(org.codehaus.commons.compiler.AbstractJavaSourceClassLoader.ProtectionDomainFactory)
-
-