标签:null tproxy instance ati handler 错误 void base 赋值
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 }
标签:null tproxy instance ati handler 错误 void base 赋值
原文地址:https://www.cnblogs.com/jxlys/p/9565270.html