题目
1.动态代理的应用场景?
2.aop就是代理吗?aop和代理的关系?
3.spring aop中代理有哪4种实现方式?区别?
4.代理底层操作的是什么?
5.如何查看某个class类的jvm虚拟机指令码?aspectj和instrumentation实现的逻辑是什么?它们和java proxy、cglib有什么区别?
6.动态代理技术栈图?
答案
- 基于Class字节码透视java动态代理本质 https://www.youtube.com/watch?v=9uEIOpbi-lQ&list=PLtLteuiQZN4P_H0HcrqjgBAsRepMRnyQb
- 问题5的答案:①aspectj和instrumentation是跳过代码层面直接在class文件里织入字节码指令,而java proxy和cglib是生成新的class。 ②前面两个是需要用到反射的。③共同点就是它们底层都是通过字节码实现的。 ④ 其中cglib和instrumentation对字节码的操作都是通过ASM实现的。java proxy 和 aspectj是自己操作字节码。
- 动态代理技术栈图:

Java Proxy示例代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
import java.lang.reflect.Proxy; public class ProxyTest { public static void main(String[] args) { Object userServiceProxy = Proxy.newProxyInstance(UserService.class.getClassLoader(), new Class[]{UserService.class}, (proxy, method, args1) -> { System.out.println("before" + method.getName()); Object invoke = method.invoke((UserService) username -> System.out.println("user " + username + " saved"), args1); System.out.println("after"); return invoke; }); ((UserService)userServiceProxy).save("xiaoming"); } } |
使用javap -c ProxyTest.class查看字节码信息

0