package org.hotswap.agent.plugin.proxy.hscglib;
import java.lang.instrument.IllegalClassFormatException;
import org.hotswap.agent.javassist.ClassPool;
import org.hotswap.agent.plugin.proxy.ProxyBytecodeGenerator;
import org.hotswap.agent.plugin.proxy.ProxyBytecodeTransformer;
import org.hotswap.agent.plugin.proxy.SinglestepProxyTransformer;
/**
* Redefines Cglib Enhancer proxy classes. Uses CglibEnhancerProxyBytecodeGenerator for the bytecode generation.
*
* @author Erki Ehtla
*
*/
public class CglibEnhancerProxyTransformer extends SinglestepProxyTransformer {
private GeneratorParams params;
private ClassLoader loader;
/**
*
* @param classBeingRedefined
* @param classPool
* Classpool of the classloader
* @param classfileBuffer
* new definition of Class<?>
* @param loader
* classloader of classBeingRedefined
* @param params
* parameters used to generate proxy
* @throws IllegalClassFormatException
*/
public CglibEnhancerProxyTransformer(Class<?> classBeingRedefined, ClassPool classPool, byte[] classfileBuffer,
ClassLoader loader, GeneratorParams params) {
super(classBeingRedefined, classPool, classfileBuffer);
this.loader = loader;
this.params = params;
}
/**
*
* @param classBeingRedefined
* @param cc
* CtClass from classfileBuffer
* @param cp
* @param classfileBuffer
* new definition of Class<?>
* @param loader
* ClassLoader of the classBeingRedefined
* @return classfileBuffer or new Proxy defition if there are signature changes
* @throws IllegalClassFormatException
*/
public static byte[] transform(Class<?> classBeingRedefined, ClassPool classPool, byte[] classfileBuffer,
ClassLoader loader, GeneratorParams params) throws Exception {
return new CglibEnhancerProxyTransformer(classBeingRedefined, classPool, classfileBuffer, loader, params)
.transformRedefine();
}
@Override
protected ProxyBytecodeGenerator createGenerator() {
return new CglibEnhancerProxyBytecodeGenerator(params, loader);
}
@Override
protected ProxyBytecodeTransformer createTransformer() {
return new CglibProxyBytecodeTransformer(classPool);
}
}