@Override
public IProxyClassInfo createProxyClass(IProxyBuildPlan plan) {
String internalName = AsmUtil.getAsmInternalName(plan.getProxyClassName());
Type proxyType = Type.getObjectType(internalName);
String[] interfaces = getInternalNames(plan.getImplementedInterfaces());
String superClass = Type.getInternalName(plan.getSuperClass());
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS);
cw.visit(V1_5, ACC_PUBLIC, internalName, null, superClass, interfaces);
cw.visitField(ACC_PUBLIC, SUBJECT_FIELD, IInstrumenterConstant.OBJECT_TYPE.getDescriptor(), null, null).visitEnd();
Map<IMethodBuildPlan, String> methodFields = generateDelegationMethodTargetFields(plan, cw);
generateConstructor(plan, proxyType, cw);
for (Entry<IMethodBuildPlan, String> entry : methodFields.entrySet()) {
createDelegationMethod(proxyType, entry.getKey(), entry.getValue(), cw);
}
cw.visitEnd();
byte[] bytecode = cw.toByteArray();
Class<?> cl = loadClass(bytecode, plan.getProxyClassName(), plan.getTargetClassLoader());
injectDelegationTargetFields(plan, methodFields, cl);
return new ASMProxyClassInfo(cl);
}