1700448135
1700448136
//后处理
1700448137
1700448138
System.out.println(“后处理”);
1700448139
1700448140
return obj;
1700448141
1700448142
}
1700448143
1700448144
}
1700448145
1700448146
注意看,这里没有了代理主题角色,取而代之的是SubjectHandler作为主要的逻辑委托处理,其中invoke方法是接口InvocationHandler定义必须实现的,它完成了对真实方法的调用。
1700448147
1700448148
我们来详细了解一下InvocationHanlder接口,动态代理是根据被代理的接口生成所有方法的,也就是说给定一个(或多个)接口,动态代理会宣称“我已经实现该接口下的所有方法了”,那各位读者想想看,动态代理怎么才能实现代理接口中的方法呢?在默认情况下所有方法的返回值都是空的,是的,虽然代理已经实现了它,但是没有任何的逻辑含义,那怎么办?好办,通过InvocationHandler接口的实现类来实现,所有方法都是由该Handler进行处理的,即所有被代理的方法都由InvocationHandler接管实际的处理任务。
1700448149
1700448150
我们接着来看动态代理的场景类,代码如下:
1700448151
1700448152
public static void main(String[]args){
1700448153
1700448154
//具体主题角色,也就是被代理类
1700448155
1700448156
Subject subject=new RealSubject();
1700448157
1700448158
//代理实例的处理Handler
1700448159
1700448160
InvocationHandler handler=new SubjectHandler(subject);
1700448161
1700448162
//当前加载器
1700448163
1700448164
ClassLoader cl=subject.getClass().getClassLoader();
1700448165
1700448166
//动态代理
1700448167
1700448168
Subject proxy=(Subject)Proxy.newProxyInstance(cl, subject.getClass().
1700448169
1700448170
getInterfaces(),handler);
1700448171
1700448172
//执行具体主题角色方法
1700448173
1700448174
proxy.request();
1700448175
1700448176
}
1700448177
1700448178
此时就实现了不用显式创建代理类即实现代理的功能,例如可以在被代理角色执行前进行权限判断,或者执行后进行数据校验。
1700448179
1700448180
动态代理很容易实现通用的代理类,只要在InvocationHandler的invoke方法中读取持久化数据即可实现,而且还能实现动态切入的效果,这也是AOP(Aspect Oriented Programming)编程理念。
1700448181
1700448182
1700448183
1700448184
[
上一页 ]
[ :1.700448135e+09 ]
[
下一页 ]