1700461166
1700461167
1700461168
1700461169
1700461170
图12-9 动态代理调用过程示意图
1700461171
1700461172
读者可能注意到我们以上的代码还有更进一步的扩展余地,注意看DynamicProxy类,它是一个通用类,不具有业务意义,如果我们再产生一个实现类是不是就很有意义了呢?如代码清单12-31所示。
1700461173
1700461174
代码清单12-31 具体业务的动态代理
1700461175
1700461176
public class SubjectDynamicProxy extends DynamicProxy{
1700461177
1700461178
public static<T>T newProxyInstance(Subject subject){
1700461179
1700461180
//获得ClassLoader
1700461181
1700461182
ClassLoader loader=subject.getClass().getClassLoader();
1700461183
1700461184
//获得接口数组
1700461185
1700461186
Class<?>[]classes=subject.getClass().getInterfaces();
1700461187
1700461188
//获得handler
1700461189
1700461190
InvocationHandler handler=new MyInvocationHandler(subject);
1700461191
1700461192
return newProxyInstance(loader,classes,handler);
1700461193
1700461194
}
1700461195
1700461196
}
1700461197
1700461198
如此扩展以后,高层模块对代理的访问会更加简单,如代码清单12-32所示。
1700461199
1700461200
代码清单12-32 场景类
1700461201
1700461202
public class Client{
1700461203
1700461204
public static void main(String[]args){
1700461205
1700461206
//定义一个主题
1700461207
1700461208
Subject subject=new RealSubject();
1700461209
1700461210
//定义主题的代理
1700461211
1700461212
Subject proxy=SubjectDynamicProxy.newProxyInstance(subject);
1700461213
1700461214
//代理的行为
1700461215
[
上一页 ]
[ :1.700461166e+09 ]
[
下一页 ]