import jdk.internal.org.objectweb.asm.ClassWriter; import jdk.internal.org.objectweb.asm.MethodVisitor; import jdk.internal.org.objectweb.asm.Opcodes; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class DynamicProxyExample { public static void main(String[] args) { HelloService helloService = new HelloServiceImpl(); HelloService helloProxy = createProxy(helloService); helloProxy.sayHello(); } public static HelloService createProxy(final HelloService helloService) { ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES); cw.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC, "ProxyClass", null, "java/lang/Object", new String[]{"HelloService"}); MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "<init>", "()V", null, null); mv.visitCode(); mv.visitVarInsn(Opcodes.ALOAD, 0); mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false); mv.visitInsn(Opcodes.RETURN); mv.visitMaxs(1, 1); mv.visitEnd(); mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "sayHello", "()V", null, null); mv.visitCode(); mv.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;"); mv.visitLdcInsn("Before method execution"); mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false); mv.visitVarInsn(Opcodes.ALOAD, 1); mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "HelloService", "sayHello", "()V", true); mv.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;"); mv.visitLdcInsn("After method execution"); mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false); mv.visitInsn(Opcodes.RETURN); mv.visitMaxs(2, 2); mv.visitEnd(); cw.visitEnd(); Class<?> proxyClass = Proxy.defineClass0(ProxyClassLoader.class.getClassLoader(), new String[]{"ProxyClass"}, cw.toByteArray()); try { return (HelloService) proxyClass.newInstance(); e.printStackTrace(); } return null; } } interface HelloService { void sayHello(); } class HelloServiceImpl implements HelloService { @Override public void sayHello() { System.out.println("Hello World!"); } } class ProxyClassLoader extends ClassLoader { } import jdk.internal.org.objectweb.asm.ClassWriter; import jdk.internal.org.objectweb.asm.MethodVisitor; import jdk.internal.org.objectweb.asm.Opcodes; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class AOPExample { public static void main(String[] args) { HelloService helloService = new HelloServiceImpl(); HelloService helloProxy = createProxy(helloService); helloProxy.sayHello(); } public static HelloService createProxy(final HelloService helloService) { ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES); cw.visit(Opcodes.V1_8, Opcodes.ACC_PUBLIC, "ProxyClass", null, "java/lang/Object", new String[]{"HelloService"}); MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "<init>", "()V", null, null); mv.visitCode(); mv.visitVarInsn(Opcodes.ALOAD, 0); mv.visitMethodInsn(Opcodes.INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false); mv.visitInsn(Opcodes.RETURN); mv.visitMaxs(1, 1); mv.visitEnd(); mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "sayHello", "()V", null, null); mv.visitCode(); mv.visitMethodInsn(Opcodes.INVOKESTATIC, "AOPExample", "before", "()V", false); mv.visitVarInsn(Opcodes.ALOAD, 1); mv.visitMethodInsn(Opcodes.INVOKEINTERFACE, "HelloService", "sayHello", "()V", true); mv.visitMethodInsn(Opcodes.INVOKESTATIC, "AOPExample", "after", "()V", false); mv.visitInsn(Opcodes.RETURN); mv.visitMaxs(2, 2); mv.visitEnd(); cw.visitEnd(); Class<?> proxyClass = Proxy.defineClass0(ProxyClassLoader.class.getClassLoader(), new String[]{"ProxyClass"}, cw.toByteArray()); try { return (HelloService) proxyClass.newInstance(); e.printStackTrace(); } return null; } public static void before() { System.out.println("Before method execution"); } public static void after() { System.out.println("After method execution"); } } interface HelloService { void sayHello(); } class HelloServiceImpl implements HelloService { @Override public void sayHello() { System.out.println("Hello World!"); } } class ProxyClassLoader extends ClassLoader { }


上一篇:
下一篇:
切换中文