spring 中动态代理应用广泛。
如果是静态代理需要代理和被代理对象实现相同的接口,(其实代理就是代理接口!!!!!)。而动态代理的动态就体现在不是我们自己写代码new 出代理对象,而是利用JDK的Proxy的静态方法生成代理对象。其有三个参数
- 类加载器
使用同一个类加载器加载的类才能比较相同 - 代理接口列表
代理 终究是要作为目标对象 调用,需要知道其代理的接口从而生成代理对象。 - 调用处理器
当真正发生调用的时候,我们可以在调用处理器调用方法之前或者之后加入自己的逻辑。
优雅的写法
public class ProxyInvocationHandler implements InvocationHandler {
//代理的接口
private Object object;
public void setRent(Object object) {
this.object = object;
}
public Object getProxy(){
return Proxy.newProxyInstance(this.getClass().getClassLoader(),object.getClass().getInterfaces(),this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return method.invoke(object,args);
}
}
//host 实现了Rent接口
Host host = new Host();
ProxyInvocationHandler pih = new ProxyInvocationHandler();
pih.setRent(host);
Rent proxy = (Rent)pih.getProxy();
proxy.rent();