package org.hotswap.agent.plugin.proxy.hscglib; import org.hotswap.agent.javassist.ClassPool; import org.hotswap.agent.javassist.CtClass; import org.hotswap.agent.javassist.CtMethod; import org.hotswap.agent.plugin.proxy.AbstractProxyBytecodeTransformer; /** * Transforms the bytecode of a new Cglib proxy definition so it is initialized on the first access of one of its * methods. * * @author Erki Ehtla * */ public class CglibProxyBytecodeTransformer extends AbstractProxyBytecodeTransformer { public CglibProxyBytecodeTransformer(ClassPool classPool) { super(classPool); } @Override protected String getInitCall(CtClass cc, String initFieldName) throws Exception { CtMethod[] methods = cc.getDeclaredMethods(); StringBuilder strB = new StringBuilder(); for (CtMethod ctMethod : methods) { if (ctMethod.getName().startsWith("CGLIB$STATICHOOK")) { ctMethod.insertAfter(initFieldName + "=true;"); strB.insert(0, ctMethod.getName() + "();"); break; } } if (strB.length() == 0) throw new RuntimeException("Could not find CGLIB$STATICHOOK method"); return strB.toString() + "CGLIB$BIND_CALLBACKS(this);"; } }