打字猴:1.700448111e+09
1700448111
1700448112 //被代理的对象
1700448113
1700448114 private Subject subject;
1700448115
1700448116 public SubjectHandler(Subject_subject){
1700448117
1700448118 subject=_subject;
1700448119
1700448120 }
1700448121
1700448122 //委托处理方法
1700448123
1700448124 public Object invoke(Object proxy, Method method, Object[]args)
1700448125
1700448126 throws Throwable{
1700448127
1700448128 //预处理
1700448129
1700448130 System.out.println(“预处理”);
1700448131
1700448132 //直接调用被代理类的方法
1700448133
1700448134 Object obj=method.invoke(subject, args);
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);
[ 上一页 ]  [ :1.700448111e+09 ]  [ 下一页 ]