1. 程式人生 > >java代理基礎類1.0

java代理基礎類1.0

getclass 設置 row 必須 obj proxy lan throws 麻煩

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 }

java代理基礎類1.0