动态代理
来源:互联网 发布:股票雷达 知乎 编辑:程序博客网 时间:2024/06/05 04:35
代理模式:设计模式的一种,引用<大话设计模式>一书的一句话,“代理模式其实就是在访问对象时引入一定程度的间接性,因为这种间接性,可以附加多种用途”。
详细代码:
public interface BookDAO { void addBook();}public class BookDAOImpl implements BookDAO { public void addBook() { System.out.println("添加一本书"); }}//关于动态代理有一个proxy类和一个InvocationHandler接口//实现动态代理主要的两部分,proxy的newProxyInstance方法和InvocationHandler的invoke方法/** * 动态代理实现类 */public class BookDAOProxy implements InvocationHandler { private Object obj; public BookDAOProxy( ){ } public BookDAOProxy( Object obj ){ this.obj = objImpl; } /** * buildProxy根据参数传过来的接口实现类对象(被代理对象), * 调用proxy类的newProxyInstance方法生成一个代理对象 * @param objImpl * @return */ public Object buildProxy(Object objImpl) { this.obj = objImpl;//这里根据反射得到objImpl的类加载器,objImpl的接口数组,还需要InvocationHandler接口的子类实例 return Proxy.newProxyInstance(objImpl.getClass().getClassLoader(), objImpl.getClass().getInterfaces(), this); }//invoke方法顾名思义就是调用的意思,三个参数(代理对象,方法,方法参数)实际实现这个方法时候只需要后两个参数就够了 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result = null; System.out.println("图书添加开始之前的方法"); result = method.invoke(obj, null);//注意:这里的obj可不是newProxyInstance方法返回的代理对象 System.out.println("图书添加开始之后的方法"); return result; }}//test public static void main(String[] args) { //实例一个动态代理类对象 BookDAOProxy bookDAOProxy = new BookDAOProxy(); //调用动态代理实现类的buildProxy方法, BookDAO proxy = (BookDAO) bookDAOProxy.buildProxy(new BookDAOImpl()); proxy.addBook(); }//输出结果:图示添加开始之前的方法添加一本书图示添加开始之后的方法
问题来了,invoke方法并没有用到代理对象,method.invoke(obj,null)用的只是bookDAOImpl的实例
为什么代理对象会执行invoke方法;
原因就是在执行Proxy.newProxyInstance方法的时候,返回的代理对象继承了Proxy,又把接口赋给了Proxy类
在代理对象执行invocationHandler的invoke方法时有一句代码super.h.invoke
由于水平有限,源码并没全看懂所以只能这么理解了。。
还有一个问题就是invocationHandler的invoke方法参数列表的第一个参数proxy(也就是代理对象)一直没用到
某个大神的博客解释就是:留给实现者用proxy代理对象通过反射搞事情用的,
0 0
- 代理-->静态代理&动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 数据结构与算法(C语言版)__链表
- 图像显示与加载——opencv(转)
- 使用 Node.js 的优势和劣势都有哪些?
- 巧用mybatis 的<foreach>标签的 index 属性解决批量排序值问题
- 第16周项目1-验证算法(6)堆排序
- 动态代理
- HashMap的工作原理
- 在java中获取URL的域名或IP与端口
- sed 查找文件的某一行内容
- OpenCV 获取摄像头并显示摄像头视频
- hg 相关指令
- Java集合(fail-fast机制)
- 二叉搜索树的第k个节点
- 利用JavaFx开发RIA桌面应用-获取屏幕四个角落的坐标