org.springframework.core

## Class OverridingClassLoader

- java.lang.Object
- - java.lang.ClassLoader
  - - org.springframework.core.DecoratingClassLoader
    - - 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

Fields
`static String[]` `DEFAULT_EXCLUDED_PACKAGES` Packages that are excluded by default

### Constructor Summary

Constructors
Constructor and Description
`OverridingClassLoader(ClassLoader parent)` Create a new OverridingClassLoader for the given class loader.

### Method Summary

Methods
`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, getClassLoadingLock, getPackage, getPackages, getParent, getResource, getResourceAsStream, getResources, getSystemClassLoader, getSystemResource, getSystemResourceAsStream, getSystemResources, loadClass, registerAsParallelCapable, 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)