欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java代理基础类1.0

程序员文章站 2022-06-11 16:03:37
1.代理的书写,是比较麻烦的,写原生代理,又是一件无聊且容易遗漏的事情。写了一个简单的代理类,可借鉴也可指出错误。 调用如下: ......

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 }