Package groovy.lang
Class GroovyClassLoader
java.lang.Object
java.lang.ClassLoader
java.security.SecureClassLoader
java.net.URLClassLoader
groovy.lang.GroovyClassLoader
- All Implemented Interfaces:
java.io.Closeable
,java.lang.AutoCloseable
- Direct Known Subclasses:
GroovyClassLoader.InnerLoader
public class GroovyClassLoader
extends java.net.URLClassLoader
A ClassLoader which can load Groovy classes. The loaded classes are cached,
classes from other classloaders should not be cached. To be able to load a
script that was asked for earlier but was created later it is essential not
to keep anything like a "class not found" information for that class name.
This includes possible parent loaders. Classes that are not cached are always
reloaded.
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static class
GroovyClassLoader.ClassCollector
static class
GroovyClassLoader.InnerLoader
-
Field Summary
Fields Modifier and Type Field Description protected EvictableCache<java.lang.String,java.lang.Class>
classCache
this cache contains the loaded classes or PARSING, if the class is currently parsedprotected StampedCommonCache<java.lang.String,java.lang.Class>
sourceCache
This cache contains mappings of file name to class. -
Constructor Summary
Constructors Constructor Description GroovyClassLoader()
creates a GroovyClassLoader using the current Thread's context Class loader as parent.GroovyClassLoader(GroovyClassLoader parent)
creates a GroovyClassLoader using the given GroovyClassLoader as parent.GroovyClassLoader(java.lang.ClassLoader loader)
creates a GroovyClassLoader using the given ClassLoader as parentGroovyClassLoader(java.lang.ClassLoader loader, CompilerConfiguration config)
creates a GroovyClassLoader using the given ClassLoader as parent.GroovyClassLoader(java.lang.ClassLoader parent, CompilerConfiguration config, boolean useConfigurationClasspath)
creates a GroovyClassLoader. -
Method Summary
Modifier and Type Method Description void
addClasspath(java.lang.String path)
adds a classpath to this classloader.void
addURL(java.net.URL url)
adds a URL to the classloader.void
clearCache()
Removes all classes from the class cache.void
close()
Closes this GroovyClassLoader and clears any caches it maintains.protected GroovyClassLoader.ClassCollector
createCollector(CompilationUnit unit, SourceUnit su)
creates a ClassCollector for a new compilation.protected CompilationUnit
createCompilationUnit(CompilerConfiguration config, java.security.CodeSource source)
creates a new CompilationUnit.java.lang.Class
defineClass(java.lang.String name, byte[] b)
open up the super class define that takes raw bytesjava.lang.Class
defineClass(ClassNode classNode, java.lang.String file, java.lang.String newCodeBase)
Loads the given class node returning the implementation Class.java.lang.String
generateScriptName()
protected java.lang.Class
getClassCacheEntry(java.lang.String name)
gets a class from the class cache.protected java.lang.String[]
getClassPath()
gets the currently used classpath.java.lang.Class[]
getLoadedClasses()
Returns all Groovy classes loaded by this class loader.protected java.security.PermissionCollection
getPermissions(java.security.CodeSource codeSource)
GroovyResourceLoader
getResourceLoader()
protected long
getTimeStamp(java.lang.Class cls)
gets the time stamp of a given class.boolean
hasCompatibleConfiguration(CompilerConfiguration config)
Check if this class loader has compatibleCompilerConfiguration
with the provided one.protected boolean
isRecompilable(java.lang.Class cls)
Indicates if a class is recompilable.java.lang.Boolean
isShouldRecompile()
gets the currently set recompilation mode.protected boolean
isSourceNewer(java.net.URL source, java.lang.Class cls)
Decides if the given source is newer than a class.java.lang.Class<?>
loadClass(java.lang.String name)
protected java.lang.Class
loadClass(java.lang.String name, boolean resolve)
Implemented here to check package access prior to returning an already loaded class.java.lang.Class
loadClass(java.lang.String name, boolean lookupScriptFiles, boolean preferClassOverScript)
loads a class from a file or a parent classloader.java.lang.Class
loadClass(java.lang.String name, boolean lookupScriptFiles, boolean preferClassOverScript, boolean resolve)
loads a class from a file or a parent classloader.java.lang.Class
parseClass(GroovyCodeSource codeSource)
java.lang.Class
parseClass(GroovyCodeSource codeSource, boolean shouldCacheSource)
Parses the given code source into a Java class.java.lang.Class
parseClass(java.io.File file)
Parses the given file into a Java class capable of being runjava.lang.Class
parseClass(java.io.InputStream in, java.lang.String fileName)
Deprecated.Prefer using methods taking a Reader rather than an InputStream to avoid wrong encoding issues.java.lang.Class
parseClass(java.io.Reader reader, java.lang.String fileName)
java.lang.Class
parseClass(java.lang.String text)
Parses the given text into a Java class capable of being runjava.lang.Class
parseClass(java.lang.String text, java.lang.String fileName)
Parses the given text into a Java class capable of being runprotected java.lang.Class
recompile(java.net.URL source, java.lang.String className, java.lang.Class oldClass)
(Re)Compiles the given source.protected void
removeClassCacheEntry(java.lang.String name)
removes a class from the class cache.protected void
setClassCacheEntry(java.lang.Class cls)
sets an entry in the class cache.void
setResourceLoader(GroovyResourceLoader resourceLoader)
void
setShouldRecompile(java.lang.Boolean mode)
sets if the recompilation should be enable.Methods inherited from class java.net.URLClassLoader
definePackage, findClass, findResource, findResources, getResourceAsStream, getURLs, newInstance, newInstance
Methods inherited from class java.security.SecureClassLoader
defineClass, defineClass
Methods inherited from class java.lang.ClassLoader
clearAssertionStatus, defineClass, defineClass, defineClass, defineClass, definePackage, findClass, findLibrary, findLoadedClass, findResource, findSystemClass, getClassLoadingLock, getDefinedPackage, getDefinedPackages, getName, getPackage, getPackages, getParent, getPlatformClassLoader, getResource, getResources, getSystemClassLoader, getSystemResource, getSystemResourceAsStream, getSystemResources, getUnnamedModule, isRegisteredAsParallelCapable, registerAsParallelCapable, resolveClass, resources, setClassAssertionStatus, setDefaultAssertionStatus, setPackageAssertionStatus, setSigners
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-
Field Details
-
classCache
this cache contains the loaded classes or PARSING, if the class is currently parsed -
sourceCache
This cache contains mappings of file name to class. It is used to bypass compilation.
-
-
Constructor Details
-
GroovyClassLoader
public GroovyClassLoader()creates a GroovyClassLoader using the current Thread's context Class loader as parent. -
GroovyClassLoader
public GroovyClassLoader(java.lang.ClassLoader loader)creates a GroovyClassLoader using the given ClassLoader as parent -
GroovyClassLoader
creates a GroovyClassLoader using the given GroovyClassLoader as parent. This loader will get the parent's CompilerConfiguration -
GroovyClassLoader
public GroovyClassLoader(java.lang.ClassLoader parent, CompilerConfiguration config, boolean useConfigurationClasspath)creates a GroovyClassLoader.- Parameters:
parent
- the parent class loaderconfig
- the compiler configurationuseConfigurationClasspath
- determines if the configurations classpath should be added
-
GroovyClassLoader
creates a GroovyClassLoader using the given ClassLoader as parent.
-
-
Method Details
-
setResourceLoader
-
getResourceLoader
-
defineClass
public java.lang.Class defineClass(ClassNode classNode, java.lang.String file, java.lang.String newCodeBase)Loads the given class node returning the implementation Class.WARNING: this compilation is not synchronized
- Parameters:
classNode
-- Returns:
- a class
-
hasCompatibleConfiguration
Check if this class loader has compatibleCompilerConfiguration
with the provided one.- Parameters:
config
- the compiler configuration to test for compatibility- Returns:
true
if the provided config is exactly the same instance ofCompilerConfiguration
as this loader has
-
parseClass
public java.lang.Class parseClass(java.io.File file) throws CompilationFailedException, java.io.IOExceptionParses the given file into a Java class capable of being run- Parameters:
file
- the file name to parse- Returns:
- the main class defined in the given script
- Throws:
CompilationFailedException
java.io.IOException
-
parseClass
public java.lang.Class parseClass(java.lang.String text, java.lang.String fileName) throws CompilationFailedExceptionParses the given text into a Java class capable of being run- Parameters:
text
- the text of the script/class to parsefileName
- the file name to use as the name of the class- Returns:
- the main class defined in the given script
- Throws:
CompilationFailedException
-
parseClass
Parses the given text into a Java class capable of being run- Parameters:
text
- the text of the script/class to parse- Returns:
- the main class defined in the given script
- Throws:
CompilationFailedException
-
generateScriptName
public java.lang.String generateScriptName() -
parseClass
public java.lang.Class parseClass(java.io.Reader reader, java.lang.String fileName) throws CompilationFailedException- Throws:
CompilationFailedException
-
parseClass
@Deprecated public java.lang.Class parseClass(java.io.InputStream in, java.lang.String fileName) throws CompilationFailedExceptionDeprecated.Prefer using methods taking a Reader rather than an InputStream to avoid wrong encoding issues. UseparseClass
instead- Throws:
CompilationFailedException
-
parseClass
- Throws:
CompilationFailedException
-
parseClass
public java.lang.Class parseClass(GroovyCodeSource codeSource, boolean shouldCacheSource) throws CompilationFailedExceptionParses the given code source into a Java class. If there is a class file for the given code source, then no parsing is done, instead the cached class is returned.- Parameters:
shouldCacheSource
- if true then the generated class will be stored in the source cache- Returns:
- the main class defined in the given script
- Throws:
CompilationFailedException
-
getClassPath
protected java.lang.String[] getClassPath()gets the currently used classpath.- Returns:
- a String[] containing the file information of the urls
- See Also:
URLClassLoader.getURLs()
-
getPermissions
protected java.security.PermissionCollection getPermissions(java.security.CodeSource codeSource)- Overrides:
getPermissions
in classjava.net.URLClassLoader
-
createCompilationUnit
protected CompilationUnit createCompilationUnit(CompilerConfiguration config, java.security.CodeSource source)creates a new CompilationUnit. If you want to add additional phase operations to the CompilationUnit (for example to inject additional methods, variables, fields), then you should overwrite this method.- Parameters:
config
- the compiler configuration, usually the same as for this class loadersource
- the source containing the initial file to compile, more files may follow during compilation- Returns:
- the CompilationUnit
-
createCollector
creates a ClassCollector for a new compilation.- Parameters:
unit
- the compilationUnitsu
- the SourceUnit- Returns:
- the ClassCollector
-
defineClass
public java.lang.Class defineClass(java.lang.String name, byte[] b)open up the super class define that takes raw bytes -
loadClass
public java.lang.Class loadClass(java.lang.String name, boolean lookupScriptFiles, boolean preferClassOverScript) throws java.lang.ClassNotFoundException, CompilationFailedExceptionloads a class from a file or a parent classloader. This method does call loadClass(String, boolean, boolean, boolean) with the last parameter set to false.- Throws:
CompilationFailedException
- if compilation was not successfuljava.lang.ClassNotFoundException
-
getClassCacheEntry
protected java.lang.Class getClassCacheEntry(java.lang.String name)gets a class from the class cache. This cache contains only classes loaded through this class loader or an InnerLoader instance. If no class is stored for a specific name, then the method should return null.- Parameters:
name
- of the class- Returns:
- the class stored for the given name
- See Also:
removeClassCacheEntry(String)
,setClassCacheEntry(Class)
,clearCache()
-
setClassCacheEntry
protected void setClassCacheEntry(java.lang.Class cls)sets an entry in the class cache.- Parameters:
cls
- the class- See Also:
removeClassCacheEntry(String)
,getClassCacheEntry(String)
,clearCache()
-
removeClassCacheEntry
protected void removeClassCacheEntry(java.lang.String name)removes a class from the class cache.- Parameters:
name
- of the class- See Also:
getClassCacheEntry(String)
,setClassCacheEntry(Class)
,clearCache()
-
addURL
public void addURL(java.net.URL url)adds a URL to the classloader.- Overrides:
addURL
in classjava.net.URLClassLoader
- Parameters:
url
- the new classpath element
-
isRecompilable
protected boolean isRecompilable(java.lang.Class cls)Indicates if a class is recompilable. Recompilable means, that the classloader will try to locate a groovy source file for this class and then compile it again, adding the resulting class as entry to the cache. Giving null as class is like a recompilation, so the method should always return true here. Only classes that are implementing GroovyObject are compilable and only if the timestamp in the class is lower than Long.MAX_VALUE.NOTE: First the parent loaders will be asked and only if they don't return a class the recompilation will happen. Recompilation also only happen if the source file is newer.
- Parameters:
cls
- the class to be tested. If null the method should return true- Returns:
- true if the class should be compiled again
- See Also:
isSourceNewer(URL, Class)
-
setShouldRecompile
public void setShouldRecompile(java.lang.Boolean mode)sets if the recompilation should be enable. There are 3 possible values for this. Any value different than null overrides the value from the compiler configuration. true means to recompile if needed false means to never recompile.- Parameters:
mode
- the recompilation mode- See Also:
CompilerConfiguration
-
isShouldRecompile
public java.lang.Boolean isShouldRecompile()gets the currently set recompilation mode. null means, the compiler configuration is used. False means no recompilation and true means that recompilation will be done if needed.- Returns:
- the recompilation mode
-
loadClass
public java.lang.Class loadClass(java.lang.String name, boolean lookupScriptFiles, boolean preferClassOverScript, boolean resolve) throws java.lang.ClassNotFoundException, CompilationFailedExceptionloads a class from a file or a parent classloader.- Parameters:
name
- of the class to be loadedlookupScriptFiles
- if false no lookup at files is done at allpreferClassOverScript
- if true the file lookup is only done if there is no classresolve
- seeClassLoader.loadClass(java.lang.String, boolean)
- Returns:
- the class found or the class created from a file lookup
- Throws:
java.lang.ClassNotFoundException
- if the class could not be foundCompilationFailedException
- if the source file could not be compiled
-
recompile
protected java.lang.Class recompile(java.net.URL source, java.lang.String className, java.lang.Class oldClass) throws CompilationFailedException, java.io.IOException(Re)Compiles the given source. This method starts the compilation of a given source, if the source has changed since the class was created. For this isSourceNewer is called.- Parameters:
source
- the source pointer for the compilationclassName
- the name of the class to be generatedoldClass
- a possible former class- Returns:
- the old class if the source wasn't new enough, the new class else
- Throws:
CompilationFailedException
- if the compilation failedjava.io.IOException
- if the source is not readable- See Also:
isSourceNewer(URL, Class)
-
loadClass
public java.lang.Class<?> loadClass(java.lang.String name) throws java.lang.ClassNotFoundException- Overrides:
loadClass
in classjava.lang.ClassLoader
- Throws:
java.lang.ClassNotFoundException
-
loadClass
protected java.lang.Class loadClass(java.lang.String name, boolean resolve) throws java.lang.ClassNotFoundExceptionImplemented here to check package access prior to returning an already loaded class.- Overrides:
loadClass
in classjava.lang.ClassLoader
- Throws:
CompilationFailedException
- if the compilation failedjava.lang.ClassNotFoundException
- if the class was not found- See Also:
ClassLoader.loadClass(java.lang.String, boolean)
-
getTimeStamp
protected long getTimeStamp(java.lang.Class cls)gets the time stamp of a given class. For groovy generated classes this usually means to return the value of the static field __timeStamp. If the parameter doesn't have such a field, then Long.MAX_VALUE is returned- Parameters:
cls
- the class- Returns:
- the time stamp
-
isSourceNewer
protected boolean isSourceNewer(java.net.URL source, java.lang.Class cls) throws java.io.IOExceptionDecides if the given source is newer than a class.- Parameters:
source
- the source we may want to compilecls
- the former class- Returns:
- true if the source is newer, false else
- Throws:
java.io.IOException
- if it is not possible to open an connection for the given source- See Also:
getTimeStamp(Class)
-
addClasspath
public void addClasspath(java.lang.String path)adds a classpath to this classloader.- Parameters:
path
- is a jar file or a directory.- See Also:
addURL(URL)
-
getLoadedClasses
public java.lang.Class[] getLoadedClasses()Returns all Groovy classes loaded by this class loader.
- Returns:
- all classes loaded by this class loader
-
clearCache
public void clearCache()Removes all classes from the class cache.In addition to internal caches this method also clears any previously set MetaClass information for the given set of classes being removed.
-
close
public void close() throws java.io.IOExceptionCloses this GroovyClassLoader and clears any caches it maintains.No use should be made of this instance after this method is invoked. Any classes that are already loaded are still accessible.
- Specified by:
close
in interfacejava.lang.AutoCloseable
- Specified by:
close
in interfacejava.io.Closeable
- Overrides:
close
in classjava.net.URLClassLoader
- Throws:
java.io.IOException
- Since:
- 2.5.0
- See Also:
URLClassLoader.close()
,clearCache()
-