Java代理模式
Java代理模式
静态代理
- 需要手动实现被代理方法的增强,每一个被代理的类都需要手动实现一个代理类。
- 静态代理再编译时就将接口、实现类、代理类编译成一个个class文件
动态代理
- 动态代理不需要为每一个目标类单独创建一个代理类,也不必须实现接口,可以直接代理实现类(CGLIB代理类)。
- 动态代理是再运行时动态生成字节码,并加载到JVM中的。
Jdk 动态代理
- 通过实现接口的方式实现
- 使用Proxy.newProxyInstance 来动态生成被代理接口的一个新实例, 新生成的代理对象实例的所有方法都调用给定处理器InvocationHandler 的invoke方法
- 使用代理生成的实例调用接口的方法时,实际是调用处理器的invoke方法。
- 如果接口有实现类,可以再invoke中调用接口实现类的原有方法。
- 这种方式代理只能代理接口或实现接口的类。
CGLIB 动态代理
- CGLIB动态代理通过继承的方式实现。
- CGLIB使用Enhancer.create() 来生成一个继承了被代理类的子类的对象, 生成的子类中 重写了代理类的所有方法,调用处理器 MethodInterceptor 的intercept 方法
- 使用代理生成的实例调用目标类的方法时,实际调用的是动态生成的子类的对象的方法,也即调用类intercept方法
- 这种方式可以代理没有实现任何接口的类。