反射
反射的入口是名称为Class的类
代理
静态代理
动态代理
- Java SDK
- cglib
1 | public static void main(String[] args) { |
CGLIB 与 Java SDK 动态代理的区别
Java SDK 动态代理局限在于,他只能为接口创建代理,返回的代理对象也只能转换到某个接口类型,如果一个类没有接口,或者希望代理非接口中定义的方法,那就没有办法了。
Java SDK 代理面向的是一组接口,它为这些接口创建了一个实现类,接口的具体实现逻辑是通过自定义的InvocationHandler实现的,这个实现是自定义的,也就是说,其背后都不一定有真正被代理的对象,也可能多个实际对象,根据情况动态选择。cglib代理面向的是一个具体的类,它动态创建了一个新类,也继承了改类,重写了其方法。
从代理的角度看,Java SDK代理的是对象,需要先有一个实际对象,自定义的InvocationHandler引用该对象,然后创建一个代理类和代理对象,客户端访问的是代理对象,代理对象最后再代用实际对象的方法,cglib代理的是类,创建的对象只有一个。
动态代理的优点
使用动态代理可以编写通用的代理逻辑,用于各种类型的被代理对象,而不用每个被代理的类型都创建一个静态代理类。