org.springframework.core
Class OverridingClassLoader

java.lang.Object
  extended by java.lang.ClassLoader
      extended by org.springframework.core.DecoratingClassLoader
          extended by org.springframework.core.OverridingClassLoader
Direct Known Subclasses:
SimpleInstrumentableClassLoader, SimpleThrowawayClassLoader

public class OverridingClassLoader
extends DecoratingClassLoader

ClassLoader that does not always delegate to the parent loader, as normal class loaders do. This enables, for example, instrumentation to be forced in the overriding ClassLoader, or a "throwaway" class loading behavior, where selected classes are temporarily loaded in the overriding ClassLoader, in order to load an instrumented version of the class in the parent ClassLoader later on.

Since:
2.0.1
Author:
Rod Johnson, Juergen Hoeller

Field Summary
static String[] DEFAULT_EXCLUDED_PACKAGES
          Packages that are excluded by default
 
Constructor Summary
OverridingClassLoader(ClassLoader parent)
          Create a new OverridingClassLoader for the given class loader.
 
Method Summary
protected  boolean isEligibleForOverriding(String className)
          Determine whether the specified class is eligible for overriding by this class loader.
protected  byte[] loadBytesForClass(String name)
          Load the defining bytes for the given class, to be turned into a Class object through a ClassLoader.defineClass(byte[], int, int) call.
protected  Class loadClass(String name, boolean resolve)
           
protected  Class loadClassForOverriding(String name)
          Load the specified class for overriding purposes in this ClassLoader.
protected  InputStream openStreamForClass(String name)
          Open an InputStream for the specified class.
protected  byte[] transformIfNecessary(String name, byte[] bytes)
          Transformation hook to be implemented by subclasses.
 
Methods inherited from class org.springframework.core.DecoratingClassLoader
excludeClass, excludePackage, isExcluded
 
Methods inherited from class java.lang.ClassLoader
clearAssertionStatus, defineClass, defineClass, defineClass, defineClass, definePackage, findClass, findLibrary, findLoadedClass, findResource, findResources, findSystemClass, getPackage, getPackages, getParent, getResource, getResourceAsStream, getResources, getSystemClassLoader, getSystemResource, getSystemResourceAsStream, getSystemResources, loadClass, resolveClass, setClassAssertionStatus, setDefaultAssertionStatus, setPackageAssertionStatus, setSigners
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

DEFAULT_EXCLUDED_PACKAGES

public static final String[] DEFAULT_EXCLUDED_PACKAGES
Packages that are excluded by default

Constructor Detail

OverridingClassLoader

public OverridingClassLoader(ClassLoader parent)
Create a new OverridingClassLoader for the given class loader.

Parameters:
parent - the ClassLoader to build an overriding ClassLoader for
Method Detail

loadClass

protected Class loadClass(String name,
                          boolean resolve)
                   throws ClassNotFoundException
Overrides:
loadClass in class ClassLoader
Throws:
ClassNotFoundException

isEligibleForOverriding

protected boolean isEligibleForOverriding(String className)
Determine whether the specified class is eligible for overriding by this class loader.

Parameters:
className - the class name to check
Returns:
whether the specified class is eligible
See Also:
DecoratingClassLoader.isExcluded(java.lang.String)

loadClassForOverriding

protected Class loadClassForOverriding(String name)
                                throws ClassNotFoundException
Load the specified class for overriding purposes in this ClassLoader.

The default implementation delegates to ClassLoader.findLoadedClass(java.lang.String), loadBytesForClass(java.lang.String) and ClassLoader.defineClass(byte[], int, int).

Parameters:
name - the name of the class
Returns:
the Class object, or null if no class defined for that name
Throws:
ClassNotFoundException - if the class for the given name couldn't be loaded

loadBytesForClass

protected byte[] loadBytesForClass(String name)
                            throws ClassNotFoundException
Load the defining bytes for the given class, to be turned into a Class object through a ClassLoader.defineClass(byte[], int, int) call.

The default implementation delegates to openStreamForClass(java.lang.String) and transformIfNecessary(java.lang.String, byte[]).

Parameters:
name - the name of the class
Returns:
the byte content (with transformers already applied), or null if no class defined for that name
Throws:
ClassNotFoundException - if the class for the given name couldn't be loaded

openStreamForClass

protected InputStream openStreamForClass(String name)
Open an InputStream for the specified class.

The default implementation loads a standard class file through the parent ClassLoader's getResourceAsStream method.

Parameters:
name - the name of the class
Returns:
the InputStream containing the byte code for the specified class

transformIfNecessary

protected byte[] transformIfNecessary(String name,
                                      byte[] bytes)
Transformation hook to be implemented by subclasses.

The default implementation simply returns the given bytes as-is.

Parameters:
name - the fully-qualified name of the class being transformed
bytes - the raw bytes of the class
Returns:
the transformed bytes (never null; same as the input bytes if the transformation produced no changes)