谈谈Java反射机制,动态代理是基于什么原理?
反射机制
是Java语言提供的一种基础功能,赋予程序在运行时自省(introspect,官方用语)的能力。
通过反射我们可以直接操作类或者对象,比如获取某个对象的类定义,获取类声明的属性和方法,调用方法或者构造对象,甚至可以运行时修改类定义。
动态代理
是一种方便运行时动态构建代理、动态处理代理方法调用的机制,很多场景都是利用类似机制做到的,比如用来包装RPC调用、面向切面的编程(AOP)。
实现动态代理的方式很多,比如JDK自身提供的动态代理,就是主要利用了上面提到的反射机制。还有其他的实现方式,比如利用传说中更高性能的字节码操作机制,类
似ASM、 cglib(基于ASM)、 Javassist等。
JDK自身提供的动态代理 vs cglib(基于ASM)
JDK Proxy的优势:
最小化依赖关系,减少依赖意味着简化开发和维护, JDK本身的支持,可能比cglib更加可靠。
平滑进行JDK版本升级,而字节码类库通常需要进行更新以保证在新版Java上能够使用。
代码实现简单
cglib框架的优势:
有的时候调用目标可能不便实现额外接口,从某种角度看,限定调用者实现接口是有些侵入性的实践,类似cglib动态代理就没有这种限制。
只操作我们关心的类,而不必为其他相关类增加工作量。
高性能。
来源:https://www.cnblogs.com/it-chen/p/11685070.html