jdk动态代理
2021-08-20 本文已影响0人
单调的灵魂
使用步骤
- 创建接口及实现类
- 实现代理处理器:实现 InvocationHandler ,实现 invoke(Proxy proxy,Method method,Object[] args) 方法
- 通过 Proxy.newProxyInstance(ClassLoaderloader, Class[] interfaces, InvocationHandler h) 获得代理类
- 通过代理类调用方法。
是什么&为什么
- 静态代理的实质是代理同一个接口不同实现类
静态代理的缺点:
- 代理类和实现类都会去实现相同的接口,导致代码重复,如果接口变化,维护成本也会增加
- 一个代理类只能服务于一个接口,大型项目无法胜任
于是就有了动态代理
所谓动态代理是指:在程序运行期间根据需要动态创建代理类及其实例来完成具体的功能
本质是java 自动帮你实现了代理类
实现动态代理
关键方法:
public static Object newProxyInstance(ClassLoader loader,//
Class<?>[] interfaces,
InvocationHandler h)
loader
:指定的用loader来加载代理类,(通常是接口实现类的loader)类加载器只有三个
interfaces
: 代理类需要实现的接口
h: 动态代理类再执行时,会调用h里面的invoke方法来执行
返回的对象实现的是InvocationHandler 中的 invoke(Object proxy, Method method, Object[] args)
方法
返回对象调用参数详解形如
public final boolean equals(Object var1) throws {
try {
return (Boolean)super.h.invoke(this, m1, new Object[]{var1});//关键
} catch (RuntimeException | Error var3) {
throw var3;
} catch (Throwable var4) {
throw new UndeclaredThrowableException(var4);
}
}
h是InvocationHandler
invoke(Object proxy, Method method, Object[])
输入参数 proxy指的是动态代理本身
上层调用实现,(也就是invocationHandler的实现)通常如下
class MyInvocationHandler implements InvocationHandler{
private Object target; //实现类
public MyInvocationHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("代理handler");
Object rv=method.invoke(target,args);//调用 实现类的方法
return rv;
}
}
也就是说通常自动生成动态代理类实现的是InvocationHandler
中的上下文,再加上实现类中的方法实现
动态代理类,代理了实现类的接口,toString
、equals
、hashCode
这几个方法