您好,欢迎访问一九零五行业门户网

用JDK DyProxy 模拟 AOP 实现

package test;import java.lang.reflect.*;/** * created with intellij idea. * user: e513480 * date: 12/3/13 * time: 4:39 pm * to change this template use file | settings | file templates. */interface someinterface { public string somemethod(
 package test;import java.lang.reflect.*;/** * created with intellij idea. * user: e513480 * date: 12/3/13 * time: 4:39 pm * to change this template use file | settings | file templates. */interface someinterface { public string somemethod(string val);}class somebean implements someinterface { @override public string somemethod(string val) { system.out.println(some method invoked, val= + val); if (throw1.equalsignorecase(val)) { throw new illegalargumentexception(this is a exception); } else if (throw2.equalsignorecase(val)) { throw new illegalstateexception(this is a exception); } return val; }}class invocationhandleradapter implements invocationhandler { private object proxyedobject; private advice advice; @override public object invoke(object proxy, method method, object[] args) throws throwable { object ret = null; try { advice.dobeforeinvoke(proxyedobject, method, args); ret = method.invoke(proxyedobject, args); advice.doaftersuccessinvoke(proxyedobject, method, args); } catch (invocationtargetexception e) { advice.doafterthrows(proxyedobject, method, args, e.getcause()); } finally { advice.doafterinvoke(proxyedobject, method, args); } return ret; } public object getproxyedobject() { return proxyedobject; } public void setproxyedobject(object proxyedobject) { this.proxyedobject = proxyedobject; } public advice getadvice() { return advice; } public void setadvice(advice advice) { this.advice = advice; }}interface advice { void dobeforeinvoke(object proxyedobject, method method, object[] args); void doaftersuccessinvoke(object proxyedobject, method method, object[] args); void doafterinvoke(object proxyedobject, method method, object[] args); void doafterthrows(object proxyedobject, method method, object[] args, throwable e) throws throwable;}public class proxytest { private static t createproxy(string beanname, advice advice) { t proxy = null; try { invocationhandleradapter handler = new invocationhandleradapter(); handler.setadvice(advice); class tobeproxedclass = class.forname(beanname); handler.setproxyedobject(tobeproxedclass.newinstance()); proxy = (t) proxy.newproxyinstance(tobeproxedclass.getclassloader(), tobeproxedclass.getinterfaces(), handler); } catch (exception e) { throw new illegalargumentexception(failed to create proxy., e); } return proxy; } public static void main(string[] args) { try { string beanname = test.somebean; advice advice = new advice() { @override public void dobeforeinvoke(object proxyedobject, method method, object[] args) { system.out.println(dobeforeinvoke); } @override public void doaftersuccessinvoke(object proxyedobject, method method, object[] args) { system.out.println(doaftersuccessinvoke); } @override public void doafterinvoke(object proxyedobject, method method, object[] args) { system.out.println(doafterinvoke); } @override public void doafterthrows(object proxyedobject, method method, object[] args, throwable e) throws throwable { system.out.println(doafterthrows, the exception is + e); if (e instanceof illegalstateexception) { //throw2 throw e; } } }; someinterface proxy = createproxy(beanname, advice); system.out.println(------------begin---------------------); string val = proxy.somemethod(hello); system.out.println(returned val= + val); system.out.println(------------end---------------------); system.out.println(------------begin---------------------); val = proxy.somemethod(throw1); system.out.println(returned val= + val); system.out.println(------------end---------------------); system.out.println(------------begin---------------------); try { val = proxy.somemethod(throw2); system.out.println(should not get to here); } catch (illegalstateexception e) { system.out.println(should get to here); } system.out.println(returned val= + val); system.out.println(------------end---------------------); } catch (exception e) { e.printstacktrace(); } }}
原文地址:用jdk dyproxy 模拟 aop 实现, 感谢原作者分享。
其它类似信息

推荐信息