欢迎来到天天文库
浏览记录
ID:43312607
大小:416.00 KB
页数:19页
时间:2019-10-08
《dyn_proxy--AOP动态代理实现方式1》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、WinterLauwinter.lau@163.comJava动态接口代理技术问题提出视窗操作系统中的钩子(Hook)方法通过编写动态链接库并注册成为系统钩子用于拦截某些WindowAPI或者某个系统消息在Java中如何拦截某个方法的执行.…..如果可以拦截,那么拦截了又有什么用?方法拦截的目的屏蔽某个函数的执行动态改写函数的代码通过在某个函数执行前和执行后增加代码来增强原有函数的功能跟踪函数被调用的情况疑问我为什么要拦截呢????我直接改写要拦截的那个函数不就可以了嘛?错!因为并不是每个方法你都可以修改的,例如其他厂商开发
2、的包,例如数据库的JDBC驱动程序包,是不是每个厂商的代码你都要插一腿呢?局限性只能拦截接口的方法!!!也就是说要拦截的函数必须是在某个接口中定义的方法。允许:Connection.close()ServletRequest.getParameter(Stringparam)不允许:String.length()现在可以开始了需要准备几个Java源文件如下:Test.java测试接口类TestImpl.java测试接口实现类TestProxy.java接口代理类Tester.java测试类,main方法所在类Test.java
3、源码packagedemo;publicinterfaceTest{publicvoidsayHello(Stringname);}TestImpl.java源码packagedemo;publicclassTestImplimplementsTest{publicvoidsayHello(Stringname){System.out.println("Hello"+name);}}TestProxy.java源码(注意红色斜体)packagedemo;importjava.lang.reflect.*;publicclass
4、TestProxyimplementsInvocationHandler{TestiTest=null;publicTestProxy(Testtest){this.iTest=test;}publicTestgetTest(){return(Test)Proxy.newProxyInstance(iTest.getClass().getClassLoader(),iTest.getClass().getInterfaces(),this);}publicObjectinvoke(Objectproxy,Methodmetho
5、d,Object[]args)throwsThrowable{System.out.println("BeforeinvokesayHello(""+args[0]+"")");Objectrst=method.invoke(iTest,args);System.out.println("AfterinvokesayHello(""+args[0]+"")");returnrst;}}Tester.java源码packagedemo;publicclassTester{publicstaticvoidmain(Stri
6、ng[]args){getTest1().sayHello("JAVA接口代理");System.out.println("====================");getTest2().sayHello("JAVA接口代理");}privatestaticTestgetTest1(){returnnewTestImpl();}privatestaticTestgetTest2(){returnnewTestProxy(newTestImpl()).getTest();}}执行结果!HelloJAVA接口代理=======
7、=============BeforeinvokesayHello("JAVA接口代理")HelloJAVA接口代理AfterinvokesayHello("JAVA接口代理")其中红色为函数接管后(TestProxy)加入的打印信息!怎么回事???在执行语句getTest2().sayHello(“JAVA接口代理”);的时候发生了两件事:类TestProxy的invoke被调用了!类TestImpl的sayHello方法也被调用了!Java的实现机制Java通过一个类Proxy以及一个接口InvocationHandler
8、来实现函数接管的功能,这两个类都是在java.lang.reflect包中。对接管对象如本例中的TestProxy的要求:必须实现接口InvocationHandler。需要保存原有接口的实例(TestProxy的属性iTest)必须提供一个方法用来获取原有接口的实例该方法不
此文档下载收益归作者所有