Open Source Repository

Home /hibernate/hibernate-3.2.7.ga | Repository Home


org/hibernate/bytecode/InstrumentedClassLoader.java
package org.hibernate.bytecode;

import org.hibernate.bytecode.util.ByteCodeHelper;

import java.io.InputStream;

/**
 * A specialized classloader which performs bytecode enhancement on class
 * definitions as they are loaded into the classloader scope.
 *
 @author Emmanuel Bernard
 @author Steve Ebersole
 */
public class InstrumentedClassLoader extends ClassLoader {

  private ClassTransformer classTransformer;

  public InstrumentedClassLoader(ClassLoader parent, ClassTransformer classTransformer) {
    superparent );
    this.classTransformer = classTransformer;
  }

  public Class loadClass(String namethrows ClassNotFoundException {
    if name.startsWith"java." || classTransformer == null ) {
      return getParent().loadClassname );
    }

    Class c = findLoadedClassname );
    if c != null ) {
      return c;
    }

    InputStream is = this.getResourceAsStreamname.replace'.''/' ".class" );
    if is == null ) {
      throw new ClassNotFoundExceptionname + " not found" );
    }

    try {
      byte[] originalBytecode = ByteCodeHelper.readByteCodeis );
      byte[] transformedBytecode = classTransformer.transformgetParent(), name, null, null, originalBytecode );
      if originalBytecode == transformedBytecode ) {
        // no transformations took place, so handle it as we would a
        // non-instrumented class
        return getParent().loadClassname );
      }
      else {
        return defineClassname, transformedBytecode, 0, transformedBytecode.length );
      }
    }
    catchThrowable t ) {
      throw new ClassNotFoundExceptionname + " not found", t );
    }
  }
}