org.springframework.instrument.classloading.tomcat

## Class TomcatInstrumentableClassLoader

- java.lang.Object
- - java.lang.ClassLoader
  - - java.security.SecureClassLoader
    - - java.net.URLClassLoader
      - - org.apache.catalina.loader.WebappClassLoader
        - - org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader

- All Implemented Interfaces:
    Closeable, AutoCloseable, org.apache.catalina.Lifecycle, org.apache.catalina.loader.Reloader

      public class TomcatInstrumentableClassLoader
      extends org.apache.catalina.loader.WebappClassLoader

  Extension of Tomcat's default class loader which adds instrumentation to loaded classes without the need to use a VM-wide agent.

  To be registered using a `<a href="http://tomcat.apache.org/tomcat-5.5-doc/config/loader.html">Loader</a>` tag in Tomcat's `<a href="http://tomcat.apache.org/tomcat-5.5-doc/config/context.html">Context</a>` definition in the `server.xml` file, with the Spring-provided "spring-tomcat-weaver.jar" file deployed into Tomcat's "server/lib" (for Tomcat 5.x) or "lib" (for Tomcat 6.x) directory. The required configuration tag looks as follows:

      <Loader loaderClass="org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader"/>

  Typically used in combination with a `ReflectiveLoadTimeWeaver` defined in the Spring application context. The `addTransformer` and `getThrowawayClassLoader` methods mirror the corresponding methods in the LoadTimeWeaver interface, as expected by ReflectiveLoadTimeWeaver.

  See the PetClinic sample application for a full example of this ClassLoader in action.

  NOTE: Requires Apache Tomcat version 5.0 or higher.

  Since:
    2.0
  Author:
    Costin Leau, Juergen Hoeller
  See Also:
    `addTransformer(java.lang.instrument.ClassFileTransformer)`, `getThrowawayClassLoader()`, `ReflectiveLoadTimeWeaver`

- - ### Nested Class Summary

    - ### Nested classes/interfaces inherited from class org.apache.catalina.loader.WebappClassLoader

      `org.apache.catalina.loader.WebappClassLoader.PrivilegedFindResource`

  - ### Field Summary

    - ### Fields inherited from class org.apache.catalina.loader.WebappClassLoader

      `allPermission, delegate, ENABLE_CLEAR_REFERENCES, files, hasExternalRepositories, jarFiles, jarNames, jarPath, jarRealFiles, lastJarAccessed, lastModifiedDates, loaderDir, loaderPC, log, needConvert, notFoundResources, packageTriggers, parent, paths, permissionList, repositories, repositoryURLs, resourceEntries, resources, securityManager, sm, started, system, triggers`

    - ### Fields inherited from interface org.apache.catalina.Lifecycle

      `AFTER_START_EVENT, AFTER_STOP_EVENT, BEFORE_START_EVENT, BEFORE_STOP_EVENT, DESTROY_EVENT, INIT_EVENT, PERIODIC_EVENT, START_EVENT, STOP_EVENT`

  - ### Constructor Summary

    Constructors
    Constructor and Description
    `TomcatInstrumentableClassLoader()` Create a new `TomcatInstrumentableClassLoader` using the current context class loader.
    `TomcatInstrumentableClassLoader(ClassLoader parent)` Create a new `TomcatInstrumentableClassLoader` with the supplied class loader as parent.

  - ### Method Summary

    Methods
    Modifier and Type | Method and Description
    --- | ---
    `void` | `addTransformer(ClassFileTransformer transformer)` Delegate for LoadTimeWeaver's `addTransformer` method.
    `protected org.apache.catalina.loader.ResourceEntry` | `findResourceInternal(String name, String path)`
    `ClassLoader` | `getThrowawayClassLoader()` Delegate for LoadTimeWeaver's `getThrowawayClassLoader` method.
    `String` | `toString()`

    - ### Methods inherited from class org.apache.catalina.loader.WebappClassLoader

      `addLifecycleListener, addPermission, addPermission, addPermission, addRepository, addURL, clearReferences, closeJARs, deleteDir, filter, findClass, findClassInternal, findLifecycleListeners, findLoadedClass0, findLoadedResource, findRepositories, findResource, findResourceInternal, findResources, getAntiJARLocking, getDelegate, getJarPath, getPermissions, getResource, getResourceAsStream, getResources, getURI, getURL, getURLs, isPackageSealed, loadClass, loadClass, loadedByThisOrChild, modified, nullInstance, openJARs, refreshPolicy, removeLifecycleListener, setAntiJARLocking, setDelegate, setJarPath, setParentClassLoader, setResources, setWorkDir, start, stop, validate, validateJarFile`

    - ### Methods inherited from class java.net.URLClassLoader

      `close, definePackage, newInstance, newInstance`

    - ### Methods inherited from class java.security.SecureClassLoader

      `defineClass, defineClass`

    - ### Methods inherited from class java.lang.ClassLoader

      `clearAssertionStatus, defineClass, defineClass, defineClass, defineClass, definePackage, findLibrary, findLoadedClass, findSystemClass, getClassLoadingLock, getPackage, getPackages, getParent, getResources, getSystemClassLoader, getSystemResource, getSystemResourceAsStream, getSystemResources, registerAsParallelCapable, resolveClass, setClassAssertionStatus, setDefaultAssertionStatus, setPackageAssertionStatus, setSigners`

    - ### Methods inherited from class java.lang.Object

      `clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait`

- - ### Constructor Detail

    - #### TomcatInstrumentableClassLoader

          public TomcatInstrumentableClassLoader()

      Create a new `TomcatInstrumentableClassLoader` using the current context class loader.
      See Also:
        `TomcatInstrumentableClassLoader(ClassLoader)`

    - #### TomcatInstrumentableClassLoader

          public TomcatInstrumentableClassLoader(ClassLoader parent)

      Create a new `TomcatInstrumentableClassLoader` with the supplied class loader as parent.
      Parameters:
        `parent` - the parent `ClassLoader` to be used

  - ### Method Detail

    - #### addTransformer

          public void addTransformer(ClassFileTransformer transformer)

      Delegate for LoadTimeWeaver's `addTransformer` method. Typically called through ReflectiveLoadTimeWeaver.
      See Also:
        `LoadTimeWeaver.addTransformer(java.lang.instrument.ClassFileTransformer)`, `ReflectiveLoadTimeWeaver`

    - #### getThrowawayClassLoader

          public ClassLoader getThrowawayClassLoader()

      Delegate for LoadTimeWeaver's `getThrowawayClassLoader` method. Typically called through ReflectiveLoadTimeWeaver.
      See Also:
        `LoadTimeWeaver.getThrowawayClassLoader()`, `ReflectiveLoadTimeWeaver`

    - #### findResourceInternal

          protected org.apache.catalina.loader.ResourceEntry findResourceInternal(String name,
                                                                      String path)

      Overrides:
        `findResourceInternal` in class `org.apache.catalina.loader.WebappClassLoader`

    - #### toString

          public String toString()

      Overrides:
        `toString` in class `org.apache.catalina.loader.WebappClassLoader`