前言
代理模式,尤其是动态代理,他从思想上改变了我们对编程的认识,可以想象一个切面我们在其中添加任何控制如事务、日志、权限等,而这也是面向切面编程的核心,更是spring Aop的核心,而设计才是实用的,框架和配置都是虚的,尤其当抛开jdk底层代码设计,才发现其中的来龙去脉和乐趣。
总之,动态代理设计模式的思想太强大了。接下来将用之前模拟的jdk动态代码和jdk本身自带的动态来模拟一个案例
大概物理情景是,添加一个打野信息接口和打野代理,利用InvocationHandler实现代理对具体打野的代理
首先是一个打野接口
|
|
打野接口实现类
打野代理
为了方便这里只是打印了一个语句
测试类
输出结果:
class com.zwl.pr.LeeSinTimeProxy
JungleHandler is starting
Js is ganking
Leesin is ganking
JungleHandler is ending
至此我们发现如果我们想在这个切面中再加一个控制,好办,再写一个handle类,代理其它handle类,达到切面控制效果。
当然,以后只要实现InvocationHandler接口就能达到效果,而proxy底层都不需要知道
jdk的动态代理
同样是上面的例子,知识代理handler需要改变
|
|
其中Object proxy是指代理类,Method method是指被代理的方法,Object[] args为该方法的参数数组
接下来是测试类
|
|
其中jung将返回一个代理类的实例JungleInfo.class.getClassLoader()是类装载器,第二个参数是任何真实类拥有的全部接口的数组,第三个参数就是真实的handles
测试结果:
Jdk is starting
Js is ganking
Leesin is ganking
Jdk is ending
至此,我们利用动态代理,就可以在不修改原来代码的基础上,就可以在原来代码的基础上做操作,而这恰恰就是AOP编程的核心