private static <T> byte[] getBytecode( Class<T> iClass, Class<?> targetClass, String reflectorClassName) { ReflectorClassWriter writer = new ReflectorClassWriter(iClass, targetClass, reflectorClassName); writer.write(); return writer.toByteArray(); } }
ReflectorClassWriter(Class<?> iClass, Class<?> targetClass, String reflectorName) { super(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS); this.iClass = iClass; iType = Type.getType(iClass); reflectorType = asType(reflectorName); targetType = Type.getType(targetClass); }
private static org.objectweb.asm.commons.Method findMethod( Class<?> clazz, String methodName, Class<?>[] paramTypes) { try { return asmMethod(clazz.getMethod(methodName, paramTypes)); } catch (NoSuchMethodException e) { throw new AssertionError(e); } }
void write() { int accessModifiers = iClass.getModifiers() & (Modifier.PUBLIC | Modifier.PROTECTED | Modifier.PRIVATE); visit( V1_5, accessModifiers | ACC_SUPER | ACC_FINAL, reflectorType.getInternalName(), null, OBJECT_TYPE.getInternalName(), new String[] {iType.getInternalName()}); writeTargetField(); writeConstructor(); for (Method method : iClass.getMethods()) { if (method.isDefault()) continue; Accessor accessor = method.getAnnotation(Accessor.class); if (accessor != null) { new AccessorMethodWriter(method, accessor).write(); } else { new ReflectorMethodWriter(method).write(); } } visitEnd(); }
private void writeTargetField() { visitField(ACC_PRIVATE, TARGET_FIELD, targetType.getDescriptor(), null, null); }
private BaseAdapter( org.objectweb.asm.commons.Method asmMethod, Method method) { this( method, asmMethod, ReflectorClassWriter.this.visitMethod( Opcodes.ACC_PUBLIC, asmMethod.getName(), asmMethod.getDescriptor(), null, ReflectorClassWriter.getInternalNames(method.getExceptionTypes()))); }
private static <T> Class<? extends T> createReflectorClass( Class<T> iClass, Class<?> targetClass) { String reflectorClassName = iClass.getName() + "$$Reflector" + COUNTER.getAndIncrement(); byte[] bytecode = getBytecode(iClass, targetClass, reflectorClassName); if (DEBUG) { File file = new File("/tmp", reflectorClassName + ".class"); System.out.println("Generated reflector: " + file.getAbsolutePath()); try (OutputStream out = new FileOutputStream(file)) { out.write(bytecode); } catch (IOException e) { throw new RuntimeException(e); } } final Class<?> proxyClass; proxyClass = defineViaUnsafe(iClass, reflectorClassName, bytecode); // proxyClass = defineViaNewClassLoader(iClass, reflectorClassName, bytecode); return proxyClass.asSubclass(iClass); }
void write() { int accessModifiers = iClass.getModifiers() & (Modifier.PUBLIC | Modifier.PROTECTED | Modifier.PRIVATE); visit( V1_5, accessModifiers | ACC_SUPER | ACC_FINAL, reflectorType.getInternalName(), null, OBJECT_TYPE.getInternalName(), new String[] {iType.getInternalName()}); writeTargetField(); writeConstructor(); for (Method method : iClass.getMethods()) { if (method.isDefault()) continue; Accessor accessor = method.getAnnotation(Accessor.class); if (accessor != null) { new AccessorMethodWriter(method, accessor).write(); } else { new ReflectorMethodWriter(method).write(); } } visitEnd(); }
void write() { // write our field to hold target field reference (but just once)... if (fieldRefs.add(targetFieldName)) { visitField(ACC_PRIVATE | ACC_STATIC, fieldRefName, FIELD_TYPE.getDescriptor(), null, null); } visitCode(); if (isSetter) { // pseudocode: // field_x.set(this, arg0); loadFieldRef(); loadTarget(); loadArg(0); Class<?> parameterType = iMethod.getParameterTypes()[0]; if (parameterType.isPrimitive()) { box(Type.getType(parameterType)); } invokeVirtual(FIELD_TYPE, FIELD$SET); returnValue(); } else { // getter // pseudocode: // return field_x.get(this); loadFieldRef(); loadTarget(); invokeVirtual(FIELD_TYPE, FIELD$GET); castForReturn(iMethod.getReturnType()); returnValue(); } endMethod(); }
private BaseAdapter( org.objectweb.asm.commons.Method asmMethod, Method method) { this( method, asmMethod, ReflectorClassWriter.this.visitMethod( Opcodes.ACC_PUBLIC, asmMethod.getName(), asmMethod.getDescriptor(), null, ReflectorClassWriter.getInternalNames(method.getExceptionTypes()))); }
private static <T> Class<? extends T> createReflectorClass( Class<T> iClass, Class<?> targetClass) { String reflectorClassName = iClass.getName() + "$$Reflector" + COUNTER.getAndIncrement(); byte[] bytecode = getBytecode(iClass, targetClass, reflectorClassName); if (DEBUG) { File file = new File("/tmp", reflectorClassName + ".class"); System.out.println("Generated reflector: " + file.getAbsolutePath()); try (OutputStream out = new FileOutputStream(file)) { out.write(bytecode); } catch (IOException e) { throw new RuntimeException(e); } } final Class<?> proxyClass; proxyClass = defineViaUnsafe(iClass, reflectorClassName, bytecode); // proxyClass = defineViaNewClassLoader(iClass, reflectorClassName, bytecode); return proxyClass.asSubclass(iClass); }
private static <T> byte[] getBytecode( Class<T> iClass, Class<?> targetClass, String reflectorClassName) { ReflectorClassWriter writer = new ReflectorClassWriter(iClass, targetClass, reflectorClassName); writer.write(); return writer.toByteArray(); } }
void write() { // write field to hold method reference... visitField(ACC_PRIVATE | ACC_STATIC, methodRefName, METHOD_TYPE.getDescriptor(), null, null); visitCode(); // pseudocode: // try { // return methodN.invoke(this, *args); // } catch (InvocationTargetException e) { // throw e.getCause(); // } TryCatch tryCatch = tryStart(INVOCATION_TARGET_EXCEPTION_TYPE); loadOriginalMethodRef(); loadTarget(); loadArgArray(); invokeVirtual(METHOD_TYPE, METHOD$INVOKE); tryCatch.end(); castForReturn(iMethod.getReturnType()); returnValue(); tryCatch.handler(); int exceptionLocalVar = newLocal(THROWABLE_TYPE); storeLocal(exceptionLocalVar); loadLocal(exceptionLocalVar); invokeVirtual(THROWABLE_TYPE, THROWABLE$GET_CAUSE); throwException(); endMethod(); }
ReflectorClassWriter(Class<?> iClass, Class<?> targetClass, String reflectorName) { super(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS); this.iClass = iClass; iType = Type.getType(iClass); reflectorType = asType(reflectorName); targetType = Type.getType(targetClass); }
private static org.objectweb.asm.commons.Method findMethod( Class<?> clazz, String methodName, Class<?>[] paramTypes) { try { return asmMethod(clazz.getMethod(methodName, paramTypes)); } catch (NoSuchMethodException e) { throw new AssertionError(e); } }
private void writeTargetField() { visitField(ACC_PRIVATE, TARGET_FIELD, targetType.getDescriptor(), null, null); }
void write() { // write our field to hold target field reference (but just once)... if (fieldRefs.add(targetFieldName)) { visitField(ACC_PRIVATE | ACC_STATIC, fieldRefName, FIELD_TYPE.getDescriptor(), null, null); } visitCode(); if (isSetter) { // pseudocode: // field_x.set(this, arg0); loadFieldRef(); loadTarget(); loadArg(0); Class<?> parameterType = iMethod.getParameterTypes()[0]; if (parameterType.isPrimitive()) { box(Type.getType(parameterType)); } invokeVirtual(FIELD_TYPE, FIELD$SET); returnValue(); } else { // getter // pseudocode: // return field_x.get(this); loadFieldRef(); loadTarget(); invokeVirtual(FIELD_TYPE, FIELD$GET); castForReturn(iMethod.getReturnType()); returnValue(); } endMethod(); }
void write() { // write field to hold method reference... visitField(ACC_PRIVATE | ACC_STATIC, methodRefName, METHOD_TYPE.getDescriptor(), null, null); visitCode(); // pseudocode: // try { // return methodN.invoke(this, *args); // } catch (InvocationTargetException e) { // throw e.getCause(); // } TryCatch tryCatch = tryStart(INVOCATION_TARGET_EXCEPTION_TYPE); loadOriginalMethodRef(); loadTarget(); loadArgArray(); invokeVirtual(METHOD_TYPE, METHOD$INVOKE); tryCatch.end(); castForReturn(iMethod.getReturnType()); returnValue(); tryCatch.handler(); int exceptionLocalVar = newLocal(THROWABLE_TYPE); storeLocal(exceptionLocalVar); loadLocal(exceptionLocalVar); invokeVirtual(THROWABLE_TYPE, THROWABLE$GET_CAUSE); throwException(); endMethod(); }