1700460844
1700460845
1700460846
1700460847
1700460848
图12-7 动态代理
1700460849
1700460850
在类图中增加了一个InvocationHanlder接口和GamePlayIH类,作用就是产生一个对象的代理对象,其中InvocationHanlder是JDK提供的动态代理接口,对被代理类的方法进行代理。我们来看程序,接口保持不变,实现类也没有变化,请参考代码清单12-1和代码清单12-2所示。我们来看DynamicProxy类,如代码清单12-22所示。
1700460851
1700460852
代码清单12-22 动态代理类
1700460853
1700460854
public class GamePlayIH implements InvocationHandler{
1700460855
1700460856
//被代理者
1700460857
1700460858
Class cls=null;
1700460859
1700460860
//被代理的实例
1700460861
1700460862
Object obj=null;
1700460863
1700460864
//我要代理谁
1700460865
1700460866
public GamePlayIH(Object_obj){
1700460867
1700460868
this.obj=_obj;
1700460869
1700460870
}
1700460871
1700460872
//调用被代理的方法
1700460873
1700460874
public Object invoke(Object proxy,Method method,Object[]args)
1700460875
1700460876
throws Throwable{
1700460877
1700460878
Object result=method.invoke(this.obj,args);
1700460879
1700460880
return result;
1700460881
1700460882
}
1700460883
1700460884
}
1700460885
1700460886
其中invoke方法是接口InvocationHandler定义必须实现的,它完成对真实方法的调用。我们来详细讲解一下InvocationHanlder接口,动态代理是根据被代理的接口生成所有的方法,也就是说给定一个接口,动态代理会宣称“我已经实现该接口下的所有方法了”,那各位读者想想看,动态代理怎么才能实现被代理接口中的方法呢?默认情况下所有的方法返回值都是空的,是的,代理已经实现它了,但是没有任何的逻辑含义,那怎么办?好办,通过InvocationHandler接口,所有方法都由该Handler来进行处理,即所有被代理的方法都由InvocationHandler接管实际的处理任务。
1700460887
1700460888
我们接下来看看场景类,如代码清单12-23所示。
1700460889
1700460890
代码清单12-23 动态代理的场景类
1700460891
1700460892
public class Client{
1700460893
[
上一页 ]
[ :1.700460844e+09 ]
[
下一页 ]