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 }