1700461160
1700461161
好,所有的程序都看完了,我们回过头来看看程序是怎么实现的。在DynamicProxy类中,我们有这样的方法:
1700461162
1700461163
this.obj=Proxy.newProxyInstance(c.getClassLoader(),c.getInterfaces(),new MyInvocationHandler(_obj));
1700461164
1700461165
该方法是重新生成了一个对象,为什么要重新生成?你要使用代理呀,注意c.getInterfaces()这句话,这是非常有意思的一句话,是说查找到该类的所有接口,然后实现接口的所有方法。当然了,方法都是空的,由谁具体负责接管呢?是new MyInvocationHandler(_Obj)这个对象。于是我们知道一个类的动态代理类是这样的一个类,由InvocationHandler的实现类实现所有的方法,由其invoke方法接管所有方法的实现,其动态调用过程如图12-9所示。
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
[
上一页 ]
[ :1.70046116e+09 ]
[
下一页 ]