设为首页 加入收藏

TOP

Java InvocationHandler 与 Proxy 动态代理详解
2019-08-14 00:09:00 】 浏览:16
Tags:Java InvocationHandler Proxy 动态 代理 详解

Proxy 类的 newProxyInstance 方法返回一个代理对象:


另外两个方法:


newProxyInstance 方法的第三个参数就是 InvocationHandler, 这个接口只有一个方法:


当调用代理类的任何一个方法的时候,invoke 方法就会被先调用,method 就是原始对象的方法,args 是该方法的原始参数。


这里的第一个参数 proxy ,他是真实对象(也就是我们要代理的对象)的代理对象,它实际上就是 Proxy 的 newInstance 方法返回的那个对象。一般情况下,我们在 invoke() 方法中都是返回真实对象方法的调用结果,当我们需要对代理对象进行连续调用(链式调用)时,可以返回这个对象。


一般情况乱下(target 为真实对象):


需要连续调用时:


现在,创建一个 Hero 接口,它包含一个 attack() 方法,然后使用动态代理,任何实现了 Hero 接口的英雄在调用 attack 前后分别打印出“施法前摇”和“施法后摇”。


再创建一个施放雷神之怒的宙斯:


最后通过 HeroProxy 类来创建代理对象:


当调用 HeroProxy 的 newInstance() 方法时,创建了原始对象 target,然后通过 Proxy 类来获取代理对象,这里没有创建实体类实现 InvocationHandler,而是直接使用了匿名类(lambda表达式)。


测试类:


执行结果:


代理类在跟踪方法调用时很有用,比如我们可以为 Comparable 接口创建代理类,在compareTo 方法调用之前,打印出一些信息,这样一来,就可以查看到排序时比较的过程。



编程开发网
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Spring 注解配置Bean 下一篇Java快速排序和归并排序详解