Class JavaSourceClassLoader

  • Direct Known Subclasses:
    CachingJavaSourceClassLoader

    public class JavaSourceClassLoader
    extends AbstractJavaSourceClassLoader
    A ClassLoader that, unlike usual ClassLoaders, 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 the JavaSourceClassLoader and create a new one.

    Notice that this class loader does not support resoures in the sense of ClassLoader.getResource(String), ClassLoader.getResourceAsStream(String) nd ClassLoader.getResources(String).

    See Also:
    ClassLoaders
    • 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 a JavaSourceClassLoader that finds Java source code in a file that resides in either of the directories specified by the given source path.
        Parameters:
        parentClassLoader - See ClassLoader
        sourcePath - A collection of directories that are searched for Java source files in the given order
        characterEncoding - The encoding of the Java source files (null for platform default encoding)
      • JavaSourceClassLoader

        public JavaSourceClassLoader​(java.lang.ClassLoader parentClassLoader,
                                     ResourceFinder sourceFinder,
                                     @Nullable
                                     java.lang.String characterEncoding)
        Constructs a JavaSourceClassLoader that finds Java 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(String, Reader)).

        Parameters:
        parentClassLoader - See ClassLoader
        sourceFinder - Used to locate additional source files
        characterEncoding - The encoding of the Java source files (null for platform default encoding)
    • Method Detail

      • setSourcePath

        public void setSourcePath​(java.io.File[] sourcePath)
        Specified by:
        setSourcePath in class AbstractJavaSourceClassLoader
        Parameters:
        sourcePath - The sequence of directories to search for Java source files
      • setSourceCharset

        public void setSourceCharset​(java.nio.charset.Charset charset)
        Specified by:
        setSourceCharset in class AbstractJavaSourceClassLoader
        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:
        setDebuggingInfo in class AbstractJavaSourceClassLoader
        Parameters:
        debugSource - Whether line number debugging information should be generated
        debugLines - Whether variables debugging information should be generated
        debugVars - Whether source file debugging information should be generated
      • setTargetVersion

        public void setTargetVersion​(int version)
      • findClass

        protected java.lang.Class<?> findClass​(@Nullable
                                               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

        @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 null if no source code could be found
        Throws:
        java.lang.ClassNotFoundException - on compilation problems