private void generateGetProxyClass(Type selfType, ClassVisitor cw) { // make getter for proxy class GeneratorAdapter gpc = new GeneratorAdapter(Opcodes.ACC_PUBLIC, new org.objectweb.asm.commons.Method("___getProxyClass", PROXY_CLASS_TYPE, EMPTY_TYPE_ARR), null, EMPTY_TYPE_ARR, cw); gpc.getStatic(selfType, PROXY_CLASS_FIELD_NAME, PROXY_CLASS_TYPE); gpc.returnValue(); gpc.endMethod(); }
private void generateGetProxyClass(Type selfType, ClassVisitor cw) { // make getter for proxy class GeneratorAdapter gpc = new GeneratorAdapter(Opcodes.ACC_PUBLIC, new org.objectweb.asm.commons.Method("___getProxyClass", PROXY_CLASS_TYPE, EMPTY_TYPE_ARR), null, EMPTY_TYPE_ARR, cw); gpc.getStatic(selfType, PROXY_CLASS_FIELD_NAME, PROXY_CLASS_TYPE); gpc.returnValue(); gpc.endMethod(); }
/** * @see InternalJavaProxy */ private static void generate___getProxyClass(Type selfType, ClassVisitor cw) { // public JavaProxyClass __getProxyClass() { return /* static */ __proxy_class; } // make getter for proxy class (due implements InternalJavaProxy) GeneratorAdapter gpc = new GeneratorAdapter(Opcodes.ACC_PUBLIC, new org.objectweb.asm.commons.Method("___getProxyClass", PROXY_CLASS_TYPE, EMPTY_TYPE_ARRAY), null, EMPTY_TYPE_ARRAY, cw); gpc.getStatic(selfType, PROXY_CLASS_FIELD_NAME, PROXY_CLASS_TYPE); gpc.returnValue(); gpc.endMethod(); }
/** * @see InternalJavaProxy */ private static void generate___getProxyClass(Type selfType, ClassVisitor cw) { // public JavaProxyClass __getProxyClass() { return /* static */ __proxy_class; } // make getter for proxy class (due implements InternalJavaProxy) GeneratorAdapter gpc = new GeneratorAdapter(Opcodes.ACC_PUBLIC, new org.objectweb.asm.commons.Method("___getProxyClass", PROXY_CLASS_TYPE, EMPTY_TYPE_ARRAY), null, EMPTY_TYPE_ARRAY, cw); gpc.getStatic(selfType, PROXY_CLASS_FIELD_NAME, PROXY_CLASS_TYPE); gpc.returnValue(); gpc.endMethod(); }
private void generateGetInvocationHandler(Type selfType, ClassVisitor cw) { // make getter for handler GeneratorAdapter gh = new GeneratorAdapter(Opcodes.ACC_PUBLIC, new org.objectweb.asm.commons.Method("___getInvocationHandler", INVOCATION_HANDLER_TYPE, EMPTY_TYPE_ARR), null, EMPTY_TYPE_ARR, cw); gh.loadThis(); gh.getField(selfType, INVOCATION_HANDLER_FIELD_NAME, INVOCATION_HANDLER_TYPE); gh.returnValue(); gh.endMethod(); }
private void generateGetInvocationHandler(Type selfType, ClassVisitor cw) { // make getter for handler GeneratorAdapter gh = new GeneratorAdapter(Opcodes.ACC_PUBLIC, new org.objectweb.asm.commons.Method("___getInvocationHandler", INVOCATION_HANDLER_TYPE, EMPTY_TYPE_ARR), null, EMPTY_TYPE_ARR, cw); gh.loadThis(); gh.getField(selfType, INVOCATION_HANDLER_FIELD_NAME, INVOCATION_HANDLER_TYPE); gh.returnValue(); gh.endMethod(); }
/** * @see InternalJavaProxy */ private static void generate___getInvocationHandler(Type selfType, ClassVisitor cw) { // public JavaProxyInvocationHandler ___getInvocationHandler() { return this.__handler; } // make getter for handler (due implements InternalJavaProxy) GeneratorAdapter gh = new GeneratorAdapter(Opcodes.ACC_PUBLIC, new org.objectweb.asm.commons.Method("___getInvocationHandler", INVOCATION_HANDLER_TYPE, EMPTY_TYPE_ARRAY), null, EMPTY_TYPE_ARRAY, cw); gh.loadThis(); gh.getField(selfType, INVOCATION_HANDLER_FIELD_NAME, INVOCATION_HANDLER_TYPE); gh.returnValue(); gh.endMethod(); }
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; } }
/** * @see InternalJavaProxy */ private static void generate___getInvocationHandler(Type selfType, ClassVisitor cw) { // public JavaProxyInvocationHandler ___getInvocationHandler() { return this.__handler; } // make getter for handler (due implements InternalJavaProxy) GeneratorAdapter gh = new GeneratorAdapter(Opcodes.ACC_PUBLIC, new org.objectweb.asm.commons.Method("___getInvocationHandler", INVOCATION_HANDLER_TYPE, EMPTY_TYPE_ARRAY), null, EMPTY_TYPE_ARRAY, cw); gh.loadThis(); gh.getField(selfType, INVOCATION_HANDLER_FIELD_NAME, INVOCATION_HANDLER_TYPE); gh.returnValue(); gh.endMethod(); }
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(ClassDefiningClassLoader loader, String targetClassName, Class superClass, Class[] interfaces, Map<MethodKey, MethodData> methods, Type selfType) { ClassWriter cw = beginProxyClass(targetClassName, superClass, interfaces, loader); GeneratorAdapter clazzInit = createClassInitializer(selfType, cw); generateConstructors(superClass, selfType, cw); generate___getProxyClass(selfType, cw); generate___getInvocationHandler(selfType, cw); generateProxyMethods(superClass, methods, selfType, cw, clazzInit); // finish class initializer clazzInit.returnValue(); clazzInit.endMethod(); // end class cw.visitEnd(); Class clazz = loader.defineClass(selfType.getClassName(), cw.toByteArray()); // trigger class initialization for the class try { Field proxy_class = clazz.getDeclaredField(PROXY_CLASS_FIELD_NAME); // proxy_class.setAccessible(true); // field is public return (JavaProxyClass) proxy_class.get(clazz); } catch (NoSuchFieldException|IllegalAccessException ex) { Helpers.throwException(ex); return null; // re-throws (although unexpected) } }
private JavaProxyClass generate(ClassDefiningClassLoader loader, String targetClassName, Class superClass, Class[] interfaces, Map<MethodKey, MethodData> methods, Type selfType) { ClassWriter cw = beginProxyClass(targetClassName, superClass, interfaces, loader); GeneratorAdapter clazzInit = createClassInitializer(selfType, cw); generateConstructors(superClass, selfType, cw); generate___getProxyClass(selfType, cw); generate___getInvocationHandler(selfType, cw); generateProxyMethods(superClass, methods, selfType, cw, clazzInit); // finish class initializer clazzInit.returnValue(); clazzInit.endMethod(); // end class cw.visitEnd(); Class clazz = loader.defineClass(selfType.getClassName(), cw.toByteArray()); // trigger class initialization for the class try { Field proxy_class = clazz.getDeclaredField(PROXY_CLASS_FIELD_NAME); // proxy_class.setAccessible(true); // field is public return (JavaProxyClass) proxy_class.get(clazz); } catch (NoSuchFieldException|IllegalAccessException ex) { Helpers.throwException(ex); return null; // re-throws (although unexpected) } }
private static Class[] generateConstructor(Type selfType, Constructor constructor, ClassVisitor cw) { Class[] superConstructorParameterTypes = constructor.getParameterTypes(); Class[] newConstructorParameterTypes = new Class[superConstructorParameterTypes.length + 1]; ArraySupport.copy(superConstructorParameterTypes, newConstructorParameterTypes, 0, superConstructorParameterTypes.length); newConstructorParameterTypes[superConstructorParameterTypes.length] = JavaProxyInvocationHandler.class; int access = Opcodes.ACC_PUBLIC; String name1 = "<init>"; String signature = null; Class[] superConstructorExceptions = constructor.getExceptionTypes(); boolean superConstructorVarArgs = constructor.isVarArgs(); org.objectweb.asm.commons.Method super_m = new org.objectweb.asm.commons.Method( name1, Type.VOID_TYPE, toTypes(superConstructorParameterTypes)); org.objectweb.asm.commons.Method m = new org.objectweb.asm.commons.Method( name1, Type.VOID_TYPE, toTypes(newConstructorParameterTypes)); String[] exceptionNames = toInternalNames( superConstructorExceptions ); MethodVisitor mv = cw.visitMethod(access, m.getName(), m.getDescriptor(), signature, exceptionNames); // marking with @SafeVarargs so that we can correctly detect proxied var-arg constructors : if ( superConstructorVarArgs ) mv.visitAnnotation(Type.getDescriptor(VarArgs.class), true); GeneratorAdapter ga = new GeneratorAdapter(access, m, mv); ga.loadThis(); ga.loadArgs(0, superConstructorParameterTypes.length); ga.invokeConstructor(toType(constructor.getDeclaringClass()), super_m); ga.loadThis(); ga.loadArg(superConstructorParameterTypes.length); ga.putField(selfType, INVOCATION_HANDLER_FIELD_NAME, INVOCATION_HANDLER_TYPE); // do a void return ga.returnValue(); ga.endMethod(); return newConstructorParameterTypes; }
private static Class[] generateConstructor(Type selfType, Constructor constructor, ClassVisitor cw) { Class[] superConstructorParameterTypes = constructor.getParameterTypes(); Class[] newConstructorParameterTypes = new Class[superConstructorParameterTypes.length + 1]; ArraySupport.copy(superConstructorParameterTypes, newConstructorParameterTypes, 0, superConstructorParameterTypes.length); newConstructorParameterTypes[superConstructorParameterTypes.length] = JavaProxyInvocationHandler.class; int access = Opcodes.ACC_PUBLIC; String name1 = "<init>"; String signature = null; Class[] superConstructorExceptions = constructor.getExceptionTypes(); boolean superConstructorVarArgs = constructor.isVarArgs(); org.objectweb.asm.commons.Method super_m = new org.objectweb.asm.commons.Method( name1, Type.VOID_TYPE, toTypes(superConstructorParameterTypes)); org.objectweb.asm.commons.Method m = new org.objectweb.asm.commons.Method( name1, Type.VOID_TYPE, toTypes(newConstructorParameterTypes)); String[] exceptionNames = toInternalNames( superConstructorExceptions ); MethodVisitor mv = cw.visitMethod(access, m.getName(), m.getDescriptor(), signature, exceptionNames); // marking with @SafeVarargs so that we can correctly detect proxied var-arg constructors : if ( superConstructorVarArgs ) mv.visitAnnotation(Type.getDescriptor(VarArgs.class), true); GeneratorAdapter ga = new GeneratorAdapter(access, m, mv); ga.loadThis(); ga.loadArgs(0, superConstructorParameterTypes.length); ga.invokeConstructor(toType(constructor.getDeclaringClass()), super_m); ga.loadThis(); ga.loadArg(superConstructorParameterTypes.length); ga.putField(selfType, INVOCATION_HANDLER_FIELD_NAME, INVOCATION_HANDLER_TYPE); // do a void return ga.returnValue(); ga.endMethod(); return newConstructorParameterTypes; }