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

结合上一篇文章([url=http://leh627.iteye.com/blog/828434]自定义annotation 实现注入功能[/url]),里面模拟了一个拦截器。
发现在使用的时候都需要去调用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

这样实现就很好的降低了耦合
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值