Class CachingJavaSourceClassLoader
JavaSourceClassLoader that uses a resource storage provided by the application to
cache compiled classes and thus saving unnecessary recompilations.
The application provides access to the resource storage through a pair of a ResourceFinder and a ResourceCreator (see CachingJavaSourceClassLoader(ClassLoader, ResourceFinder, String, ResourceFinder, ResourceCreator).
See AbstractJavaSourceClassLoader.main(String[]) for an example how to use this class.
Notice: You must NOT rely on that this class stores some particular data in some particular resources
through the given classFileCacheResourceFinder/Creator! These serve only as a means for the CachingJavaSourceClassLoader to persistently cache some data between invocations. In other words: If you want to
compile .java files into .class files, then don't use this class but Compiler
instead!
-
Nested Class Summary
Nested classes/interfaces inherited from class AbstractJavaSourceClassLoader
AbstractJavaSourceClassLoader.ProtectionDomainFactory -
Field Summary
FieldsModifier and TypeFieldDescriptionprivate final ResourceCreatorprivate final ResourceFinderprivate final ResourceFinderFields inherited from class AbstractJavaSourceClassLoader
protectionDomainFactory -
Constructor Summary
ConstructorsConstructorDescriptionCachingJavaSourceClassLoader(ClassLoader parentClassLoader, File[] sourcePath, String characterEncoding, File cacheDirectory) CachingJavaSourceClassLoader(ClassLoader parentClassLoader, ResourceFinder sourceFinder, String characterEncoding, ResourceFinder classFileCacheResourceFinder, ResourceCreator classFileCacheResourceCreator) Notice that this class is thread-safe if and only if the classFileCacheResourceCreator stores its data atomically, i.e. -
Method Summary
Modifier and TypeMethodDescriptiongenerateBytecodes(String className) OverridesJavaSourceClassLoader.generateBytecodes(String)to implement class file caching.private static byte[]Reads all bytes from the given resource.private static voidwriteResource(ResourceCreator resourceCreator, String resourceName, byte[] data) Creates a resource with the given name and store the data in it.Methods inherited from class JavaSourceClassLoader
findClass, setCompileErrorHandler, setDebuggingInfo, setSourceCharset, setSourceFinder, setSourcePath, setTargetVersion, setWarningHandlerMethods inherited from class AbstractJavaSourceClassLoader
getResourceAsStream, main, setProtectionDomainFactory, setSourceFileCharacterEncodingMethods inherited from class 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 Details
-
classFileCacheResourceFinder
-
classFileCacheResourceCreator
-
sourceFinder
-
-
Constructor Details
-
CachingJavaSourceClassLoader
public CachingJavaSourceClassLoader(ClassLoader parentClassLoader, @Nullable File[] sourcePath, @Nullable String characterEncoding, File cacheDirectory) SeeCachingJavaSourceClassLoader(ClassLoader, ResourceFinder, String, ResourceFinder, ResourceCreator).- Parameters:
sourcePath- Directories to scan for source filescacheDirectory- Directory to use for caching generated class files (see class description)
-
CachingJavaSourceClassLoader
public CachingJavaSourceClassLoader(ClassLoader parentClassLoader, ResourceFinder sourceFinder, @Nullable String characterEncoding, ResourceFinder classFileCacheResourceFinder, ResourceCreator classFileCacheResourceCreator) Notice that this class is thread-safe if and only if the classFileCacheResourceCreator stores its data atomically, i.e. the classFileCacheResourceFinder sees the resource written by theclassFileCacheResourceCreatoronly after theOutputStreamis closed.In order to make the caching scheme work, both the classFileCacheResourceFinder and the
sourceFindermust support theResource.lastModified()method, so that the modification time of the source and the class files can be compared.- Parameters:
parentClassLoader- Attempt to load classes through this one before looking for source filessourceFinder- Finds Java source for classpkg.Clsin resourcepkg/Cls.javacharacterEncoding- Encoding of Java source ornullfor platform default encodingclassFileCacheResourceFinder- Finds precompiled classpkg.Clsin resourcepkg/Cls.class(see class description)classFileCacheResourceCreator- Stores compiled classpkg.Clsin resourcepkg/Cls.class(see class description)
-
-
Method Details
-
generateBytecodes
@Nullable protected Map<String,byte[]> generateBytecodes(String className) throws ClassNotFoundException OverridesJavaSourceClassLoader.generateBytecodes(String)to implement class file caching.- Overrides:
generateBytecodesin classJavaSourceClassLoader- Returns:
- String name => byte[] bytecode, or
nullif no source code could be found - Throws:
ClassNotFoundException- Compilation problems or class file cache I/O problems
-
readResource
Reads all bytes from the given resource.- Throws:
IOException
-
writeResource
private static void writeResource(ResourceCreator resourceCreator, String resourceName, byte[] data) throws IOException Creates a resource with the given name and store the data in it.- Throws:
IOException
-