打字猴:1.700461131e+09
1700461131 public static void main(String[]args){
1700461132
1700461133 //定义一个主题
1700461134
1700461135 Subject subject=new RealSubject();
1700461136
1700461137 //定义一个Handler
1700461138
1700461139 InvocationHandler handler=new MyInvocationHandler(subject);
1700461140
1700461141 //定义主题的代理
1700461142
1700461143 Subject proxy=DynamicProxy.newProxyInstance(subject.getClass().getClassLoader(),
1700461144
1700461145 subject.getClass().getInterfaces(),handler);
1700461146
1700461147 //代理的行为
1700461148
1700461149 proxy.doSomething(“Finish”);
1700461150
1700461151 }
1700461152
1700461153 }
1700461154
1700461155 运行结果如下所示:
1700461156
1700461157 我是前置通知,我被执行了!
1700461158
1700461159 do something!–->Finish
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
[ 上一页 ]  [ :1.700461131e+09 ]  [ 下一页 ]