Java 动态代理

反射

反射的入口是名称为Class的类

代理

静态代理

动态代理

  1. Java SDK
  2. cglib
1
2
3
4
5
6
public static void main(String[] args) {
IService realService = new RealService();
IService proxyService = (IService) Proxy.newProxyInstance(IService.class.getClassLoader(),
new Class<?>[] { IService.class }, new SimpleInvocationHandler(realService));
proxyService.sayHello();
}

CGLIB 与 Java SDK 动态代理的区别

Java SDK 动态代理局限在于,他只能为接口创建代理,返回的代理对象也只能转换到某个接口类型,如果一个类没有接口,或者希望代理非接口中定义的方法,那就没有办法了。
Java SDK 代理面向的是一组接口,它为这些接口创建了一个实现类,接口的具体实现逻辑是通过自定义的InvocationHandler实现的,这个实现是自定义的,也就是说,其背后都不一定有真正被代理的对象,也可能多个实际对象,根据情况动态选择。cglib代理面向的是一个具体的类,它动态创建了一个新类,也继承了改类,重写了其方法。
从代理的角度看,Java SDK代理的是对象,需要先有一个实际对象,自定义的InvocationHandler引用该对象,然后创建一个代理类和代理对象,客户端访问的是代理对象,代理对象最后再代用实际对象的方法,cglib代理的是类,创建的对象只有一个。

动态代理的优点

使用动态代理可以编写通用的代理逻辑,用于各种类型的被代理对象,而不用每个被代理的类型都创建一个静态代理类。