java代理基础类1.0

1.代理的书写,是比较麻烦的,写原生代理,又是一件无聊且容易遗漏的事情。写了一个简单的代理类,可借鉴也可指出错误。

 1 package cn;
 2 
 3 import java.lang.reflect.InvocationHandler;
 4 import java.lang.reflect.Method;
 5 import java.lang.reflect.Proxy;
 6 
 7 /**
 8  * 代理类的基础,必须先是设置对象(必须是接口对象赋值实现类),不然获取的代理对象会空指针。
 9  * @author jxlys
10  *
11  */
12 public class ProxyBase implements InvocationHandler {
13     private Object obj;
14 
15     public ProxyBase() {
16     }
17 
18     public ProxyBase(Object obj) {
19         this.obj = obj;
20     }
21 
22     public Object getObj() {
23         return obj;
24     }
25 
26     public void setObj(Object obj) {
27         this.obj = obj;
28     }
29 
30     /**
31      * 获得代理对象
32      * 
33      * @param t
34      * @return
35      */
36     public <T> T getProxy(Class<T> t) {
37         return getObject(t, getProxy());
38     }
39 
40     /**
41      * 获得代理对象
42      */
43     public Object getProxy() {
44         return obj != null ? Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this) : null;
45     }
46 
47     // 对象强转
48     @SuppressWarnings("unchecked")
49     public <T> T getObject(Class<T> t, Object obj) {
50         return obj != null ? (T) obj : null;
51     }
52   
53     public void beforeAction() {
54     }
55 
56     public void afterAction() {
57     }
58 
59     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
60         beforeAction();
61         Object invoke = method.invoke(obj, args);
62         afterAction();
63         return invoke;
64     }
65 }

调用如下:

 1 interface A {
 2     public void say();
 3 }
 4 
 5 class B implements A {
 6 
 7     public void say() {
 8         System.out.print("love");
 9     }
10 }
11 
12 public class TestMain {
13 
14     public static void main(String[] args) {
15      A a = new B(); 
16         a.say();//未代理17         ProxyBase pbu = new ProxyBase(a) {
18             public void beforeAction() {
19                 System.out.print("I ");
20             }
21 
22             public void afterAction() {
23                 A a = getObject(A.class, getObj());
24                 System.out.print(" You!");
25             }
26         };
27         a = pbu.getProxy(A.class);
28         pbu = null;//这一步不重要,也可以没有。
29         a.say();// 已代理,也可以用继承的方式实现代理。  
30     }
31 }

 

转载于:https://www.cnblogs.com/jxlys/p/9565270.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值