janino.net

org.codehaus.janino
Class JavaSourceClassLoader

java.lang.Object
  extended by java.lang.ClassLoader
      extended by org.codehaus.janino.JavaSourceClassLoader
Direct Known Subclasses:
CachingJavaSourceClassLoader

public class JavaSourceClassLoader
extends java.lang.ClassLoader

A ClassLoader that, unlike usual ClassLoaders, does not load byte code, but reads JavaTM 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 the JavaSourceClassLoader and create a new one.


Nested Class Summary
static interface JavaSourceClassLoader.ProtectionDomainFactory
           
 
Constructor Summary
JavaSourceClassLoader(java.lang.ClassLoader parentClassLoader, java.io.File[] optionalSourcePath, java.lang.String optionalCharacterEncoding, EnumeratorSet debuggingInformation)
          Set up a JavaSourceClassLoader that finds JavaTM 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 optionalCharacterEncoding, EnumeratorSet debuggingInformation)
          Set up a JavaSourceClassLoader that finds JavaTM source code through a given ResourceFinder.
 
Method Summary
protected  java.lang.Class defineBytecode(java.lang.String className, byte[] ba)
          Calls ClassLoader.defineClass(java.lang.String, byte[], int, int) or ClassLoader.defineClass(java.lang.String, byte[], int, int, java.security.ProtectionDomain), depending on whether or not a JavaSourceClassLoader.ProtectionDomainFactory was set.
protected  java.lang.Class defineBytecodes(java.lang.String name, java.util.Map bytecodes)
          Define a set of classes, like ClassLoader.defineClass(java.lang.String, byte[], int, int).
protected  java.lang.Class findClass(java.lang.String name)
          Implementation of ClassLoader.findClass(String).
protected  java.util.Map generateBytecodes(java.lang.String name)
          Find, scan, parse the right compilation unit.
static void main(java.lang.String[] args)
          Read JavaTM source code for a given class name, scan, parse, compile and load it into the virtual machine, and invoke its "main()" method with the given args.
 void setCompileErrorHandler(UnitCompiler.ErrorHandler optionalCompileErrorHandler)
           
 void setProtectionDomainFactory(JavaSourceClassLoader.ProtectionDomainFactory protectionDomainFactory)
           
 void setWarningHandler(WarningHandler optionalWarningHandler)
           
 
Methods inherited from class java.lang.ClassLoader
clearAssertionStatus, defineClass, defineClass, defineClass, defineClass, definePackage, findLibrary, findLoadedClass, findResource, findResources, findSystemClass, getPackage, getPackages, getParent, getResource, getResourceAsStream, getResources, getSystemClassLoader, getSystemResource, getSystemResourceAsStream, getSystemResources, loadClass, loadClass, resolveClass, setClassAssertionStatus, setDefaultAssertionStatus, setPackageAssertionStatus, setSigners
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

JavaSourceClassLoader

public JavaSourceClassLoader(java.lang.ClassLoader parentClassLoader,
                             java.io.File[] optionalSourcePath,
                             java.lang.String optionalCharacterEncoding,
                             EnumeratorSet debuggingInformation)
Set up a JavaSourceClassLoader that finds JavaTM source code in a file that resides in either of the directories specified by the given source path.

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.Scanner(String, Reader)).

Parameters:
parentClassLoader - See ClassLoader
optionalSourcePath - A collection of directories that are searched for JavaTM source files in the given order
optionalCharacterEncoding - The encoding of the JavaTM source files (null for platform default encoding)
debuggingInformation - What kind of debugging information to generate, see DebuggingInformation

JavaSourceClassLoader

public JavaSourceClassLoader(java.lang.ClassLoader parentClassLoader,
                             ResourceFinder sourceFinder,
                             java.lang.String optionalCharacterEncoding,
                             EnumeratorSet debuggingInformation)
Set up a JavaSourceClassLoader that finds JavaTM source code through a given ResourceFinder.

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.Scanner(String, Reader)).

Parameters:
parentClassLoader - See ClassLoader
sourceFinder - Used to locate additional source files
optionalCharacterEncoding - The encoding of the JavaTM source files (null for platform default encoding)
debuggingInformation - What kind of debugging information to generate, see DebuggingInformation
Method Detail

main

public static void main(java.lang.String[] args)
Read JavaTM source code for a given class name, scan, parse, compile and load it into the virtual machine, and invoke its "main()" method with the given args.

Usage is as follows:

   java [ java-option ] org.codehaus.janino.JavaSourceClassLoader [ option ] ... class-name [ arg ] ...
     java-option Any valid option for the Java Virtual Machine (e.g. "-classpath colon-separated-list-of-class-directories")
     option:
       -sourcepath colon-separated-list-of-source-directories
       -encoding character-encoding
       -g                           Generate all debugging info");
       -g:none                      Generate no debugging info");
       -g:{lines,vars,source}       Generate only some debugging info");
       -cache dir                   Cache compiled classes here");

 


setCompileErrorHandler

public void setCompileErrorHandler(UnitCompiler.ErrorHandler optionalCompileErrorHandler)
See Also:
UnitCompiler.setCompileErrorHandler(org.codehaus.janino.UnitCompiler.ErrorHandler)

setWarningHandler

public void setWarningHandler(WarningHandler optionalWarningHandler)
See Also:
Parser.setWarningHandler(WarningHandler), UnitCompiler.setCompileErrorHandler(org.codehaus.janino.UnitCompiler.ErrorHandler)

findClass

protected java.lang.Class findClass(java.lang.String name)
                             throws java.lang.ClassNotFoundException
Implementation of ClassLoader.findClass(String).

Overrides:
findClass in class java.lang.ClassLoader
Throws:
java.lang.ClassNotFoundException

generateBytecodes

protected java.util.Map generateBytecodes(java.lang.String name)
                                   throws java.lang.ClassNotFoundException
Find, scan, parse 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 null if no source code could be found
Throws:
java.lang.ClassNotFoundException - on compilation problems

defineBytecodes

protected java.lang.Class defineBytecodes(java.lang.String name,
                                          java.util.Map bytecodes)
                                   throws java.lang.ClassFormatError
Define a set of classes, like ClassLoader.defineClass(java.lang.String, byte[], int, int). If the bytecodes contains an entry for name, then the Class defined for that name is returned.

Parameters:
bytecodes - String name => byte[] bytecode
Throws:
java.lang.ClassFormatError

defineBytecode

protected java.lang.Class defineBytecode(java.lang.String className,
                                         byte[] ba)
                                  throws java.lang.ClassFormatError
Calls ClassLoader.defineClass(java.lang.String, byte[], int, int) or ClassLoader.defineClass(java.lang.String, byte[], int, int, java.security.ProtectionDomain), depending on whether or not a JavaSourceClassLoader.ProtectionDomainFactory was set.

Throws:
java.lang.ClassFormatError
See Also:
setProtectionDomainFactory(org.codehaus.janino.JavaSourceClassLoader.ProtectionDomainFactory)

setProtectionDomainFactory

public void setProtectionDomainFactory(JavaSourceClassLoader.ProtectionDomainFactory protectionDomainFactory)

janino.net