org.hibernate.bytecode.javassist.TransformingClassLoader Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of hibernate Show documentation
Show all versions of hibernate Show documentation
Relational Persistence for Java
package org.hibernate.bytecode.javassist;
import javassist.ClassPool;
import javassist.NotFoundException;
import javassist.CtClass;
import javassist.CannotCompileException;
import org.hibernate.HibernateException;
import java.io.IOException;
import java.util.ArrayList;
/**
* @author Steve Ebersole
*/
public class TransformingClassLoader extends ClassLoader {
private ClassLoader parent;
private ClassPool classPool;
/*package*/ TransformingClassLoader(ClassLoader parent, String[] classpath) {
this.parent = parent;
classPool = new ClassPool( true );
for ( int i = 0; i < classpath.length; i++ ) {
try {
classPool.appendClassPath( classpath[i] );
}
catch ( NotFoundException e ) {
throw new HibernateException(
"Unable to resolve requested classpath for transformation [" +
classpath[i] + "] : " + e.getMessage()
);
}
}
}
protected Class findClass(String name) throws ClassNotFoundException {
try {
CtClass cc = classPool.get( name );
// todo : modify the class definition if not already transformed...
byte[] b = cc.toBytecode();
return defineClass( name, b, 0, b.length );
}
catch ( NotFoundException e ) {
throw new ClassNotFoundException();
}
catch ( IOException e ) {
throw new ClassNotFoundException();
}
catch ( CannotCompileException e ) {
throw new ClassNotFoundException();
}
}
public void release() {
classPool = null;
parent = null;
}
}