动态代理
来源:互联网 发布:技术指标知乎 编辑:程序博客网 时间:2024/05/22 06:14
动态代理核心是把接口interface(被代理对象需要实现这些接口)和实现了InvocationHandler的处理器(这个处理器一般持有被代理对象)关联在一起,最后返回一个代理对象。返回的这个代理对象是含有这个前面接口interface的,而代理对象调用这个接口方法时会被拦截到InvocationHandler执行,从而实现代理。
1 定义对外接口
public interface Subject {
void request();
void response();
}
2 定义目标对象(被代理对象)
public class RealSubject implements Subject{
@Override
public void request() {
System.out.println("do request");
}
@Override
public void response() {
System.out.println("do response");
}
}
3 定义代理处理器
public class MyInvocationHandler implements InvocationHandler{
/**
* 让代理对象内部持有一个被代理的目标对象
*/
private Object target;
/**
* 设置具体被代理目标
*/
public void setTarget(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
/**
* proxy 我们代理真实对象
* method 调用的真实对象的方法method对象
* args 调用真实对象的方法参数
* 返回Object 是调用方法返回的对象
*/
---------- 这里可以添加各种增强方法 ----------
method.invoke(target, args);// 通过反射的method执行,需要执行的target实例,和传入参数
return null;
}
}
4 创建代理对象proxy
MyInvocationHandler myInvocationHandler = new MyInvocationHandler();
myInvocationHandler.setTarget(target);// 设置代理对象
/**
* 传入target的接口名,以及实际上的代理执行执行器:myInvocationHandler
* 返回代理对象,它将具有和target相同的接口,但是执行接口方法时,会拦截到myInvocationHandler执行
* 这个过程更像将接口和myInvocationHandler的绑定,然后对外生成一个代理
* 重点是后两个参数的关联,第一参数其实就是AppClassLoader
*/
Object proxy = Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), myInvocationHandler);
5 执行代理方法
Subject proxy = (Subject)proxy;
/**
* 下面的执行会被拦截到InvocationHandler的invoke方法中,从而实现代理
*/
proxy.request();
proxy.response();
接口是不变的,实现类是变化的,把不变的关联在一起(代理对象的接口和被代理对象的接口),用变化的实现差异!
- 代理-->静态代理&动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 2017.7.2
- 如何学习一块单片机的处理器
- springmvc试图解析流程
- Leetcode 1.Two Sum
- 问题备忘: It is indirectly referenced from required .class files
- 动态代理
- 水题
- springboot数据库配置
- 【Dockerfile】Ubuntu中Docker通过Dockerfile构建常用的基础环境
- 【NOIP2016提高A组模拟8.23】函数
- 利用WireShark分析H264码流
- hls之m3u8、ts、h264、AAC流格式详解
- java刷题之查漏补缺(四)
- PyCharm使用技巧:Column Selection Mode(列选择模式)