动态代理
- 基于接口的动态代理【Proxy类】
提供者:JDK 官方的 Proxy 类。
要求:被代理类最少实现一个接* - 基于子类的动态代理
提供者:第三方的 CGLib,如果报 asmxxxx 异常,需要导入 asm.jar。
要求:被代理类不能用 final 修饰的类(最终类)。**
一、使用 JDK 官方的 Proxy 类创建代理对象
被代理类 【他实现了接口】
final Actor actor = new Actor();
获取代理对象:
被代理类最少实现一个接口
创建的方式
Proxy.newProxyInstance(三个参数)
参数
ClassLoader:和被代理对象使用相同的类加载器。
Interfaces:和被代理对象具有相同的行为。实现相同的接口。
InvocationHandler:如何代理。
实现接口【Proxy类代理】
IActor proxyActor = (IActor) Proxy.newProxyInstance(
actor.getClass().getClassLoader(),
actor.getClass().getInterfaces(),
new InvocationHandler() {
## 执行被代理对象的任何方法,都会经过该方法。【 此方法有拦截的功能】
参数:
proxy:代理对象的引用。不一定每次都用得到
method:当前执行的方法对象
args:执行方法所需的参数
返回值:当前执行方法的返回值
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
String name = method.getName();
Float money = (Float) args[0];
Object rtValue = null;}
使用CGLib 的 Enhancer类创建动态代理对象
-
基于子类的动态代理
要求:
被代理对象不能是最终类
用到的类:Enhancer
用到的方法:create(Class Callback)
方法的参数:Class:被代理对象的字
Callback:如何final Actor actor = new Actor(); Actor cglibActor = (Actor) Enhancer.create(actor.getClass(), new MethodInterceptor(){ @Override public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { String name = method.getName(); Float money = (Float) args[0]; Object rtValue = nul