您的位置:首页 > 编程语言 > Java开发

轻松理解Java动态代理

2018-02-27 23:50 381 查看
动态代理是Java一种特殊的代理机制: 代理类动态生成,其优点是动态性,有两方面体现:
1)     代码动态生成, 因此可以少写很多代码,从这个角度,我们可以称动态代理是一种元编程
2)     工作类的具体类型是动态指定的, 增加了灵活性.
首先我们看一般代理的UML类图如下:



在(静态)代理中, 程序员实现的(静态定义)ProxyClass必须要(静态的,显式的)引用WorkClass
在Java动态代理中, Proxy对象由Proxy类的方法 static Object newProxyInstance(
ClassLoader loader,
Class<?>[] interfaces, // Proxy对象可以实现多个接口
InvocationHandler handler) // InvocationHandler持有WorkClass生成,这个代理对象实现了参数给定的(可能多个)interfaces接口,当在这个代理对象上调用接口定义的方法时,将转换为调用InvocationHandler的invoke方法,方法由Method对象参数指定,调用方法的实参通过Object[]封装.程序员实现了InvocationHandler对象,在这个对象中需要引用一个WorkClass对象.在invoke方法中自定义做一些想要的操作,再将实际调用转到WorkClass对象上.这就是整个动态代理的实现过程.如下图所示:



通过对动态代理的类图和调用过程分析, 可以确定这是一种策略设计模式的实现.
ProxyClass类的实现变得简单: 所有接口定义方法的实现都是将调用外包给InvocationHandler,因此在newProxyInstance指定的接口将决定编译器如何生成这个类,由于ClassLoader具有类名字空间的属性,因此二元组(接口,ClassLoader)确定了一个ProxyClass类.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: