首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

利用java.lang.reflect.Proxy 兑现代理

2012-12-22 
利用java.lang.reflect.Proxy 实现代理结合上一篇文章(自定义annotation 实现注入功能),里面模拟了一个拦

利用java.lang.reflect.Proxy 实现代理
结合上一篇文章(自定义annotation 实现注入功能),里面模拟了一个拦截器。
发现在使用的时候都需要去调用SimilarToTheInterceptor.scanAllFieldsAndMethods 方法,
如果说有多个action需要注入,很显然这是种不好的设计。
          TestAction  action = new TestAction(); 
          SimilarToTheInterceptor.scanAllFieldsAndMethods(action);// 模拟拦截器功能 
          action.saveDate1();
于是我想到使用java.lang.reflect.Proxy  去实现这个拦截器功能

正对前一篇文章的代码下面几个类需要改变
1.SimilarToTheInterceptor   该名称 ScanHelper 内容保持不变
2.增加一个新类,用来实现 拦截功能

package com.test;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;public class Handler implements InvocationHandler {private Object obj;public Handler(Object obj) {this.obj = obj;}public static Object newInstance(Object obj) {System.out.println(obj.getClass().getName());return java.lang.reflect.Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(),new Handler(obj));}public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {Object result = null;if(obj!=null){ScanHelper.scanAllFieldsAndMethods(obj);// 注入result = method.invoke(obj, args);}return result;}}

3,增加一个接口Action,然后TestAction去实现这个接口(由于proxy 必须要一个接口)
public interface Action {public void saveDate1();public void saveDate2();}

3 ,测试
package com.test;public class Main {public static void main(String[] args) {          TestAction  a = new TestAction();          Action  action = (Action) Handler.newInstance(a);          action.saveDate1();          action.saveDate2();}}


4.结果
==========Saved======TestService_1 class was invoked
==========Saved======TestService_2 class was invoked

这样实现就很好的降低了耦合

热点排行