Java动态代理的实现
来源:互联网 发布:淘宝助理5.5使用教程 编辑:程序博客网 时间:2024/05/29 16:28
动态代理的实现可以说是静态代理的一种模式升级,如果还有同学不知道代理模式的概念可以参考我的前一篇文章http://blog.csdn.net/u012481172/article/details/50157079; 下面我们分四步走来讲解一下动态代理如何使用:
一、定义一个行为规范
public interface IService { public String doSomething();}以上接口只需要由目标对象实现即可,因为我们现在不需要自己去创建代理,而是由JDK动态生成代理的。
二、实现自己的InvocationHandler
public class MyInvocationHandler implements InvocationHandler {// 目标对象private Object target;public MyInvocationHandler(Object target) {super();this.target = target;}/** * 此方法是实现了InvocationHandler的方法 * 是目标对象方法调用 */public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {System.out.println("在目标对象执行之前我先做一些事情...");// 执行目标对象的方法Object result = method.invoke(target, args);System.out.println("在目标对象执行之后我再做一些事情...");return result;}/** * 获取目标对象的代理对象 * * @return 代理对象 */public Object getProxy() {return Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), target.getClass().getInterfaces(),this);}}以上就是实现了自己的InvocationHandler,这基本上就是一个规范的写法了,之后如果我们需要创建自己的InvocationHandler,就都按照此格式来。注意在getProxy()方法中,用到了Proxy类,该类是JDK下的一个系统类,并不是我上一篇文章自己的Proxy类。
三、实现目标对象
public class RealService implements IService {public String doSomething() {System.out.println("目标对象正在做一些事情...");return "目标对象正在做一些事情...";}}
四、目标对象的使用及打印测试
public static void main(String[] args) {// 实例化目标对象IService userService = new RealService();// 实例化InvocationHandlerMyInvocationHandler invocationHandler = new MyInvocationHandler(userService);// 根据目标对象生成代理对象IService proxy = (IService) invocationHandler.getProxy();// 调用代理对象的方法proxy.doSomething();}//================== 以下为打印结果在目标对象执行之前我先做一些事情...目标对象正在做一些事情...在目标对象执行之后我再做一些事情...
五、相关资料
(1)关于动态代理的好处与应用场景:请移步至http://www.zhihu.com/question/20794107;
(2)关于Java动态代理的详细实现:请移步至:http://rejoy.iteye.com/blog/1627405;
0 0
- Java动态代理的实现
- Java动态代理的实现
- Java动态代理的实现
- Java动态代理的实现
- Java动态代理的实现
- java动态代理的实现
- java动态代理的实现
- Java动态代理的实现
- Java动态代理的实现
- Java动态代理的实现
- Java动态代理的实现
- java动态代理的实现
- Java动态代理的实现
- Java动态代理的实现
- Java动态代理的实现
- Java动态代理的实现
- Java动态代理的实现
- Java动态代理的实现
- [009]对抽象类与接口的一点思考
- 性能测试--联合使用jvisualVM与jmeter进行性能测试与接口性能分析
- redis 数据库
- Android Studio Proguard 使用总结
- 在Debian/Ubuntu上安装ssh服务
- Java动态代理的实现
- c++ list, vector, map, set 区别与用法比较
- 一篇文章看懂Android学习最佳路线(smnhguo 15-11-13)
- angularjs之ui-bootstrap的使用
- 2015-12-3-获取Android已安装的app信息
- 调用
- iOS 开发笔记和技巧总结 (五)
- iOS 横屏中添加UIImagePickerController获取系统图片
- 类中或结构体中含队列,的拷贝构造函数的书写