String classname = "AOPClassProxy$" + counter++;
CtClass template = pool.get("org.jboss.aop.proxy.ClassProxyTemplate");
CtClass superclass = pool.get(clazz.getName());
CtField mixinField = template.getField("mixins");
CtField instanceAdvisor = template.getField("instanceAdvisor");
CtClass proxy = TransformerCommon.makeClass(pool, classname, superclass);
mixinField = new CtField(mixinField.getType(), "mixins", proxy);
mixinField.setModifiers(Modifier.PRIVATE);
proxy.addField(mixinField);
instanceAdvisor = new CtField(instanceAdvisor.getType(), "instanceAdvisor", proxy);
instanceAdvisor.setModifiers(Modifier.PRIVATE);
proxy.addField(instanceAdvisor);
CtMethod writeEx = CtNewMethod.make(" public void writeExternal(java.io.ObjectOutput out)\n" +
" throws java.io.IOException\n" +
" {\n" +
" }", proxy);
CtMethod readEx = CtNewMethod.make(" public void readExternal(java.io.ObjectInput in)\n" +
" throws java.io.IOException, ClassNotFoundException\n" +
" {\n" +
" }", proxy);
CtMethod getInstanceAdvisor = CtNewMethod.make(" public org.jboss.aop.InstanceAdvisor _getInstanceAdvisor()\n" +
" {\n" +
" return instanceAdvisor;\n" +
" }", proxy);
CtMethod setInstanceAdvisor = CtNewMethod.make(" public void _setInstanceAdvisor(org.jboss.aop.InstanceAdvisor newAdvisor)\n" +
" {\n" +
" instanceAdvisor = (org.jboss.aop.ClassInstanceAdvisor) newAdvisor;\n" +
" }", proxy);
CtMethod dynamicInvoke = CtNewMethod.make(" public org.jboss.aop.joinpoint.InvocationResponse _dynamicInvoke(org.jboss.aop.joinpoint.Invocation invocation)\n" +
" throws Throwable\n" +
" {\n" +
" ((org.jboss.aop.joinpoint.InvocationBase) invocation).setInstanceResolver(instanceAdvisor.getMetaData());\n" +
" org.jboss.aop.advice.Interceptor[] aspects = instanceAdvisor.getInterceptors();\n" +
" return new org.jboss.aop.joinpoint.InvocationResponse(invocation.invokeNext(aspects));\n" +
" }", proxy);
CtMethod setMixins = CtNewMethod.make(" public void setMixins(org.jboss.aop.proxy.ProxyMixin[] mixins)\n" +
" {\n" +
" this.mixins = mixins;\n" +
" }", proxy);
CtMethod writeReplace = CtNewMethod.make(" public Object writeReplace() throws java.io.ObjectStreamException\n" +
" {\n" +
" return new org.jboss.aop.proxy.MarshalledClassProxy(this.getClass().getSuperclass(), mixins, instanceAdvisor);\n" +
" }", proxy);
proxy.addMethod(writeEx);
proxy.addMethod(readEx);
proxy.addMethod(getInstanceAdvisor);
proxy.addMethod(setInstanceAdvisor);
proxy.addMethod(dynamicInvoke);
proxy.addMethod(setMixins);
proxy.addMethod(writeReplace);
/*
CtMethod writeEx = template.getDeclaredMethod("writeExternal");
CtMethod readEx = template.getDeclaredMethod("readExternal");
CtMethod getInstanceAdvisor = template.getDeclaredMethod("_getInstanceAdvisor");
CtMethod setInstanceAdvisor = template.getDeclaredMethod("_setInstanceAdvisor");
CtMethod dynamicInvoke = template.getDeclaredMethod("_dynamicInvoke");
CtMethod setMixins = template.getDeclaredMethod("setMixins");
CtMethod writeReplace = template.getDeclaredMethod("writeReplace");
proxy.addMethod(CtNewMethod.copy(writeEx, proxy, null));
proxy.addMethod(CtNewMethod.copy(readEx, proxy, null));
proxy.addMethod(CtNewMethod.copy(getInstanceAdvisor, proxy, null));
proxy.addMethod(CtNewMethod.copy(setInstanceAdvisor, proxy, null));
proxy.addMethod(CtNewMethod.copy(dynamicInvoke, proxy, null));
proxy.addMethod(CtNewMethod.copy(setMixins, proxy, null));
proxy.addMethod(CtNewMethod.copy(writeReplace, proxy, null));
*/
proxy.addInterface(pool.get("org.jboss.aop.proxy.ClassProxy"));
proxy.addInterface(pool.get("java.io.Externalizable"));
proxy.addInterface(pool.get("org.jboss.aop.instrument.Untransformable"));
proxy.addInterface(pool.get("org.jboss.aop.proxy.MethodMapped"));
CtClass map = pool.get("java.util.Map");
CtField methodMap = new CtField(map, "methodMap", proxy);
methodMap.setModifiers(Modifier.PRIVATE | Modifier.STATIC);
proxy.addField(methodMap);
CtMethod getMethodMap = CtNewMethod.getter("getMethodMap", methodMap);
getMethodMap.setModifiers(Modifier.PUBLIC);
proxy.addMethod(getMethodMap);