dyn_proxy--AOP动态代理实现方式1

dyn_proxy--AOP动态代理实现方式1

ID:43312607

大小:416.00 KB

页数:19页

时间:2019-10-08

dyn_proxy--AOP动态代理实现方式1_第1页
dyn_proxy--AOP动态代理实现方式1_第2页
dyn_proxy--AOP动态代理实现方式1_第3页
dyn_proxy--AOP动态代理实现方式1_第4页
dyn_proxy--AOP动态代理实现方式1_第5页
资源描述:

《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)必须提供一个方法用来获取原有接口的实例该方法不

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。