Class ConcurrentClassLoader
java.lang.Object
java.lang.ClassLoader
org.jboss.modules.ConcurrentClassLoader
- Direct Known Subclasses:
ModuleClassLoader
A classloader which can delegate to multiple other classloaders without risk of deadlock. A concurrent class loader
should only ever be delegated to by another concurrent class loader; however a concurrent class loader may
delegate to a standard hierarchical class loader. In other words, holding a lock on another class loader while invoking
a method on this class loader may cause an unexpected deadlock.
-
Field Summary
FieldsModifier and TypeFieldDescriptionprivate static final ClassLoaderprotected static final Enumeration<URL> An empty enumeration, for subclasses to use if desired.private static final ThreadLocal<Boolean> private final UnlockedReadHashMap<String, Package> -
Constructor Summary
ConstructorsModifierConstructorDescriptionprotectedConstruct a new instance, using our class loader as the parent.protectedConstruct a new instance with the given parent class loader, which must be a concurrent class loader, ornullto create a root concurrent class loader. -
Method Summary
Modifier and TypeMethodDescriptionprotected final Class<?> defineOrLoadClass(String className, byte[] bytes, int off, int len) Atomically define or load the named class.protected final Class<?> defineOrLoadClass(String className, byte[] bytes, int off, int len, ProtectionDomain protectionDomain) Atomically define or load the named class.protected PackagedefinePackage(String name, String specTitle, String specVersion, String specVendor, String implTitle, String implVersion, String implVendor, URL sealBase) Defines a package by name in this ConcurrentClassLoader.protected final Class<?> Implementation ofClassLoader.findClass(String).protected Class<?> Find a class, possibly delegating to other loader(s).protected final PackagefindLoadedPackage(String name) Load a package from this class loader only.protected final URLfindResource(String name) Never used.protected URLfindResource(String name, boolean exportsOnly) Find the resource with the given name and exported status.protected InputStreamfindResourceAsStream(String name, boolean exportsOnly) Finds the resource with the given name and exported status, returning the resource content as a stream.protected final Enumeration<URL> findResources(String name) Never used.protected Enumeration<URL> findResources(String name, boolean exportsOnly) Finds the resources with the given name and exported status.protected final PackagegetPackage(String name) Load a package which is visible to this class loader.protected PackagegetPackageByName(String name) Perform the actual work to load a package which is visible to this class loader.protected Package[]Get all defined packages which are visible to this class loader.final URLgetResource(String name) Finds the resource with the given name.final InputStreamgetResourceAsStream(String name) Returns an input stream for reading the specified resource.final Enumeration<URL> getResources(String name) Finds all available resources with the given name.final Class<?> Loads the class with the specified binary name.final Class<?> Loads the class with the specified binary name.final Class<?> loadExportedClass(String className) Same asloadClass(String), except only exported classes will be considered.final Class<?> loadExportedClass(String className, boolean resolve) Same asloadClass(String,boolean), except only exported classes will be considered.private Class<?> performLoadClass(String className, boolean exportsOnly, boolean resolve) Perform a class load operation.private Class<?> performLoadClassUnchecked(String className, boolean exportsOnly, boolean resolve) Methods inherited from class ClassLoader
clearAssertionStatus, defineClass, defineClass, defineClass, defineClass, findClass, findLibrary, findLoadedClass, findResource, findSystemClass, getClassLoadingLock, getDefinedPackage, getDefinedPackages, getName, getParent, getPlatformClassLoader, getSystemClassLoader, getSystemResource, getSystemResourceAsStream, getSystemResources, getUnnamedModule, isRegisteredAsParallelCapable, registerAsParallelCapable, resolveClass, resources, setClassAssertionStatus, setDefaultAssertionStatus, setPackageAssertionStatus, setSigners
-
Field Details
-
definingLoader
-
GET_PACKAGE_SUPPRESSOR
-
EMPTY_ENUMERATION
An empty enumeration, for subclasses to use if desired. -
packages
-
-
Constructor Details
-
ConcurrentClassLoader
Construct a new instance with the given parent class loader, which must be a concurrent class loader, ornullto create a root concurrent class loader.- Parameters:
parent- the parent class loader
-
ConcurrentClassLoader
protected ConcurrentClassLoader()Construct a new instance, using our class loader as the parent.
-
-
Method Details
-
loadClass
Loads the class with the specified binary name. Equivalent to callingloadClass(className, false).- Overrides:
loadClassin classClassLoader- Parameters:
className- The binary name of the class- Returns:
- the resulting
Classinstance - Throws:
ClassNotFoundException- if the class was not found
-
loadClass
Loads the class with the specified binary name.- Overrides:
loadClassin classClassLoader- Parameters:
className- The binary name of the classresolve-trueif the class should be linked after loading- Returns:
- the resulting
Classinstance - Throws:
ClassNotFoundException
-
loadExportedClass
Same asloadClass(String), except only exported classes will be considered.- Parameters:
className- the class name- Returns:
- the class
- Throws:
ClassNotFoundException- if the class isn't found
-
loadExportedClass
public final Class<?> loadExportedClass(String className, boolean resolve) throws ClassNotFoundException Same asloadClass(String,boolean), except only exported classes will be considered.- Parameters:
className- the class nameresolve-trueif the class should be linked after loading- Returns:
- the class
- Throws:
ClassNotFoundException- if the class isn't found
-
findClass
protected Class<?> findClass(String className, boolean exportsOnly, boolean resolve) throws ClassNotFoundException Find a class, possibly delegating to other loader(s). This method should never synchronize across a delegation method call of any sort. The default implementation always throwsClassNotFoundException.If a class is to be defined by this method, it should be done via one of the atomic
defineOrLoadClassmethods rather thandefineClass()in order to avoid spurious exceptions.- Parameters:
className- the class nameexportsOnly-trueif only exported classes should be consideredresolve-trueif the class should be linked after loading- Returns:
- the class
- Throws:
ClassNotFoundException- if the class is not found
-
defineOrLoadClass
Atomically define or load the named class. If the class is already defined, the existing class is returned.- Parameters:
className- the class name to define or loadbytes- the bytes to use to define the classoff- the offset into the byte array at which the class bytes beginlen- the number of bytes in the class- Returns:
- the class
-
defineOrLoadClass
protected final Class<?> defineOrLoadClass(String className, byte[] bytes, int off, int len, ProtectionDomain protectionDomain) Atomically define or load the named class. If the class is already defined, the existing class is returned.- Parameters:
className- the class name to define or loadbytes- the bytes to use to define the classoff- the offset into the byte array at which the class bytes beginlen- the number of bytes in the classprotectionDomain- the protection domain for the defined class- Returns:
- the class
-
findClass
Implementation ofClassLoader.findClass(String).- Overrides:
findClassin classClassLoader- Parameters:
className- the class name- Returns:
- the result of
findClass(className, false, false) - Throws:
ClassNotFoundException
-
getResource
Finds the resource with the given name. The name of a resource is a'/'-separated path name that identifies the resource. If the resource name starts with"java/"then the parent class loader is used. Otherwise, this method delegates tofindResource(String, boolean).- Overrides:
getResourcein classClassLoader- Parameters:
name- the name of the resource- Returns:
- the resource URL, or
nullif no such resource exists or the invoker does not have adequate permission to access it
-
getResources
Finds all available resources with the given name.- Overrides:
getResourcesin classClassLoader- Parameters:
name- the resource name- Returns:
- an enumeration over all the resource URLs; if no resources could be found, the enumeration will be empty
- Throws:
IOException- if an I/O error occurs- See Also:
-
findResource
-
findResource
Never used.ClassLoader.getResource(String)and related methods can cause a loop condition when this method is implemented; usefindResource(String, boolean)instead.- Overrides:
findResourcein classClassLoader- Parameters:
name- ignored- Returns:
nullalways
-
findResources
Finds the resources with the given name and exported status.- Parameters:
name- the resource nameexportsOnly-trueto consider only exported resources orfalseto consider all resources- Returns:
- the resource enumeration
- Throws:
IOException- if an I/O error occurs- See Also:
-
findResources
Never used.ClassLoader.getResources(String)and related methods can cause a loop condition when this method is implemented; usefindResources(String, boolean)instead. By default, returns an empty enumeration.- Overrides:
findResourcesin classClassLoader- Parameters:
name- ignored- Returns:
- an empty enumeration
-
findResourceAsStream
Finds the resource with the given name and exported status, returning the resource content as a stream.- Parameters:
name- the resource nameexportsOnly-trueto consider only exported resources orfalseto consider all resources- Returns:
- the resource stream, or
nullif the resource is not found
-
getResourceAsStream
Returns an input stream for reading the specified resource. If the resource starts with"java/", then this method delegates to the parent class loader. Otherwise, this method delegates tofindResourceAsStream(String, boolean).- Overrides:
getResourceAsStreamin classClassLoader- Parameters:
name- the resource name- Returns:
- the resource stream, or
nullif the resource is not found
-
performLoadClass
private Class<?> performLoadClass(String className, boolean exportsOnly, boolean resolve) throws ClassNotFoundException Perform a class load operation. If the class is in the package or a subpackage of a package in the system packages list, the parent class loader is used to load the class. Otherwise, this method checks to see if the class loader object is locked; if so, it unlocks it and submits the request to the class loader thread. Otherwise, it will load the class itself by delegating tofindClass(String, boolean, boolean).- Parameters:
className- the class nameexportsOnly-trueto consider only exported resources orfalseto consider all resourcesresolve-trueto resolve the loaded class- Returns:
- the class returned by
findClass(String, boolean, boolean) - Throws:
ClassNotFoundException- iffindClass(String, boolean, boolean)throws this exception
-
performLoadClassUnchecked
private Class<?> performLoadClassUnchecked(String className, boolean exportsOnly, boolean resolve) throws ClassNotFoundException - Throws:
ClassNotFoundException
-
getPackage
Load a package which is visible to this class loader.- Overrides:
getPackagein classClassLoader- Parameters:
name- the package name- Returns:
- the package, or
nullif no such package is visible to this class loader
-
getPackageByName
Perform the actual work to load a package which is visible to this class loader. By default, uses a simple parent-first delegation strategy.- Parameters:
name- the package name- Returns:
- the package, or
nullif no such package is visible to this class loader
-
getPackages
Get all defined packages which are visible to this class loader.- Overrides:
getPackagesin classClassLoader- Returns:
- the packages
-
findLoadedPackage
-
definePackage
protected Package definePackage(String name, String specTitle, String specVersion, String specVendor, String implTitle, String implVersion, String implVendor, URL sealBase) throws IllegalArgumentException Defines a package by name in this ConcurrentClassLoader. If the package was already defined, the existing package is returned instead.- Overrides:
definePackagein classClassLoader- Parameters:
name- the package namespecTitle- the specification titlespecVersion- the specification versionspecVendor- the specification vendorimplTitle- the implementation titleimplVersion- the implementation versionimplVendor- the implementation vendorsealBase- if notnull, then this package is sealed with respect to the given code source URL- Returns:
- the newly defined package, or the existing one if one was already defined
- Throws:
IllegalArgumentException
-