package org.hotswap.agent.plugin.proxy.java; import java.util.Collections; import java.util.Map; import java.util.WeakHashMap; import org.hotswap.agent.javassist.ClassPool; import org.hotswap.agent.plugin.proxy.MultistepProxyTransformer; import org.hotswap.agent.plugin.proxy.ProxyBytecodeGenerator; import org.hotswap.agent.plugin.proxy.ProxyBytecodeTransformer; import org.hotswap.agent.plugin.proxy.TransformationState; /** * Redefines Java proxy classes. Uses several redefinition events * * @author Erki Ehtla * */ public class JavaProxyTransformer extends MultistepProxyTransformer { // Class transformation states for all the ClassLoaders. Used in the Agent ClassLoader private static final Map<Class<?>, TransformationState> TRANSFORMATION_STATES = Collections .synchronizedMap(new WeakHashMap<Class<?>, TransformationState>()); /** * * @param classBeingRedefined * @param cp * Classpool of the classloader * @param classfileBuffer * new definition of Class<?> */ public JavaProxyTransformer(Class<?> classBeingRedefined, ClassPool cp, byte[] classfileBuffer) { super(classBeingRedefined, cp, classfileBuffer, TRANSFORMATION_STATES); } /** * * @param classBeingRedefined * @param cp * Classpool of the classloader * @param classfileBuffer * new definition of Class<?> * @return classfileBuffer or new Proxy defition if there are signature changes * @throws Exception */ public static byte[] transform(Class<?> classBeingRedefined, ClassPool cp, byte[] classfileBuffer) throws Exception { return new JavaProxyTransformer(classBeingRedefined, cp, classfileBuffer).transformRedefine(); } public static boolean isReloadingInProgress() { return !TRANSFORMATION_STATES.isEmpty(); } @Override protected ProxyBytecodeGenerator createGenerator() { return new JavaProxyBytecodeGenerator(classBeingRedefined); } @Override protected ProxyBytecodeTransformer createTransformer() { return new JavaProxyBytecodeTransformer(classPool); } }