Java动态接口代理技术.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Java动态接口代理技术 问题提出 视窗操作系统中的钩子(Hook)方法 通过编写动态链接库并注册成为系统钩子用于拦截某些Window API或者某个系统消息 在Java中如何拦截某个方法的执行.….. 如果可以拦截,那么拦截了又有什么用? 方法拦截的目的 屏蔽某个函数的执行 动态改写函数的代码 通过在某个函数执行前和执行后增加代码来增强原有函数的功能 跟踪函数被调用的情况 疑问 局限性 现在可以开始了 Test.java源码 TestImpl.java源码 TestProxy.java源码(注意红色斜体) Tester.java源码 执行结果! 怎么回事??? Java的实现机制 提供给调用者的方法 实际应用举例之连接池应用 数据库连接代理实现 1 数据库连接代理实现 2 实际应用举例之Web框架 谢 谢? Winter Lau winter.lau@163.com 我为什么要拦截呢????我直接改写要拦截的那个函数不就可以了嘛? 错!因为并不是每个方法你都可以修改的,例如其他厂商开发的包,例如数据库的JDBC驱动程序包,是不是每个厂商的代码你都要插一腿呢? 只能拦截接口的方法!!! 也就是说要拦截的函数必须是在某个接口中定义的方法。 允许: Connection.close() ServletRequest.getParameter(String param) 不允许: String.length() 需要准备几个Java源文件如下: Test.java 测试接口类 TestImpl.java 测试接口实现类 TestProxy.java 接口代理类 Tester.java 测试类,main方法所在类 package demo; public interface Test { public void sayHello(String name); } package demo; public class TestImpl implements Test { public void sayHello(String name) { System.out.println(Hello +name); } } package demo; import java.lang.reflect.*; public class TestProxy implements InvocationHandler { Test iTest = null; public TestProxy(Test test) { this.iTest = test; } public Test getTest(){ return(Test)Proxy.newProxyInstance(iTest.getClass().getClassLoader(), iTest.getClass().getInterfaces(),this); } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println(Before invoke sayHello(\+args[0]+\)); Object rst = method.invoke(iTest,args); System.out.println(After invoke sayHello(\+args[0]+\)); return rst; } } package demo; public class Tester { public static void main(String[] args) { getTest1().sayHello(JAVA接口代理); System.out.println(====================); getTest2().sayHello(JAVA接口代理); } private static Test getTest1(){ return new TestImpl(); } private static Test getTest2(){ return new TestProxy(new TestImpl()).getTest(); } }

文档评论(0)

***** + 关注
实名认证
文档贡献者

本账号下所有文档分享可拿50%收益 欢迎分享

1亿VIP精品文档

相关文档