private JavaProxyClass generate(ClassLoader loader, String targetClassName, Class superClass, Class[] interfaces, Map<MethodKey, MethodData> methods, Type selfType) { ClassWriter cw = beginProxyClass(targetClassName, superClass, interfaces); GeneratorAdapter clazzInit = createClassInitializer(selfType, cw); generateConstructors(superClass, selfType, cw); generateGetProxyClass(selfType, cw); generateGetInvocationHandler(selfType, cw); generateProxyMethods(superClass, methods, selfType, cw, clazzInit); // finish class initializer clazzInit.returnValue(); clazzInit.endMethod(); // end class cw.visitEnd(); Class clazz = invokeDefineClass(loader, selfType.getClassName(), cw.toByteArray()); // trigger class initialization for the class try { Field proxy_class = clazz.getDeclaredField(PROXY_CLASS_FIELD_NAME); proxy_class.setAccessible(true); return (JavaProxyClass) proxy_class.get(clazz); } catch (Exception ex) { InternalError ie = new InternalError(); ie.initCause(ex); throw ie; } }
private JavaProxyClass generate(ClassLoader loader, String targetClassName, Class superClass, Class[] interfaces, Map<MethodKey, MethodData> methods, Type selfType) { ClassWriter cw = beginProxyClass(targetClassName, superClass, interfaces); GeneratorAdapter clazzInit = createClassInitializer(selfType, cw); generateConstructors(superClass, selfType, cw); generateGetProxyClass(selfType, cw); generateGetInvocationHandler(selfType, cw); generateProxyMethods(superClass, methods, selfType, cw, clazzInit); // finish class initializer clazzInit.returnValue(); clazzInit.endMethod(); // end class cw.visitEnd(); Class clazz = invokeDefineClass(loader, selfType.getClassName(), cw.toByteArray()); // trigger class initialization for the class try { Field proxy_class = clazz.getDeclaredField(PROXY_CLASS_FIELD_NAME); proxy_class.setAccessible(true); return (JavaProxyClass) proxy_class.get(clazz); } catch (Exception ex) { InternalError ie = new InternalError(); ie.initCause(ex); throw ie; } }