java代理基礎類1.0
阿新 • • 發佈:2018-08-31
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 classProxyBase 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) { 27this.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