已阅读5页,还剩14页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
WinterLauwinter lau Java动态接口代理技术 问题提出 视窗操作系统中的钩子 Hook 方法通过编写动态链接库并注册成为系统钩子用于拦截某些WindowAPI或者某个系统消息在Java中如何拦截某个方法的执行 如果可以拦截 那么拦截了又有什么用 方法拦截的目的 屏蔽某个函数的执行动态改写函数的代码通过在某个函数执行前和执行后增加代码来增强原有函数的功能跟踪函数被调用的情况 疑问 我为什么要拦截呢 我直接改写要拦截的那个函数不就可以了嘛 错 因为并不是每个方法你都可以修改的 例如其他厂商开发的包 例如数据库的JDBC驱动程序包 是不是每个厂商的代码你都要插一腿呢 局限性 只能拦截接口的方法 也就是说要拦截的函数必须是在某个接口中定义的方法 允许 Connection close ServletRequest getParameter Stringparam 不允许 String length 现在可以开始了 需要准备几个Java源文件如下 Test java测试接口类TestImpl java测试接口实现类TestProxy java接口代理类Tester java测试类 main方法所在类 Test java源码 packagedemo publicinterfaceTest publicvoidsayHello Stringname TestImpl java源码 packagedemo publicclassTestImplimplementsTest publicvoidsayHello Stringname System out println Hello name TestProxy java源码 注意红色斜体 packagedemo importjava lang reflect publicclassTestProxyimplementsInvocationHandler TestiTest null publicTestProxy Testtest this iTest test publicTestgetTest return Test Proxy newProxyInstance iTest getClass getClassLoader iTest getClass getInterfaces this publicObjectinvoke Objectproxy Methodmethod 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 String args getTest1 sayHello JAVA接口代理 System out println getTest2 sayHello JAVA接口代理 privatestaticTestgetTest1 returnnewTestImpl privatestaticTestgetTest2 returnnewTestProxy newTestImpl getTest 执行结果 HelloJAVA接口代理 BeforeinvokesayHello JAVA接口代理 HelloJAVA接口代理AfterinvokesayHello JAVA接口代理 其中红色为函数接管后 TestProxy 加入的打印信息 怎么回事 在执行语句getTest2 sayHello JAVA接口代理 的时候发生了两件事 类TestProxy的invoke被调用了 类TestImpl的sayHello方法也被调用了 Java的实现机制 Java通过一个类Proxy以及一个接口InvocationHandler来实现函数接管的功能 这两个类都是在java lang reflect包中 对接管对象如本例中的TestProxy的要求 必须实现接口InvocationHandler 需要保存原有接口的实例 TestProxy的属性iTest 必须提供一个方法用来获取原有接口的实例该方法不是简单的返回接口实例 而是通过Proxy类的newProxyInstance来生成一个代理对象 提供给调用者的方法 要接管某个接口实现类的某个函数 那么就要求不允许直接将该实现未经代理处理后直接返回给调用者 在我们这个例子中不允许直接返回类TestImpl的实例 而应该通过代理类用于获取代理对象实例的方法 也就是类似于在Tester类中我们使用的是getTest2而不是getTest1方法的缘故 实际应用举例之连接池应用 数据库连接池一个好的数据库连接池应该具备下面两个条件无需改变用户使用习惯自动连接回收功能对于连接池来讲 连接的获取肯定必须是通过连接池所提供的方法进行 但是要允许用户直接调用Connection close来关闭连接 要不就是改变了用户使用习惯 因为close是接口Connection的一个方法所以可以使用我们前面介绍的方法来接管该方法 数据库连接代理实现1 publicclass ConnectionimplementsInvocationHandler privatefinalstaticStringCLOSE METHOD NAME close privateConnectionconn null privatebooleaninUse false 数据库的忙状态privatelonglastAccessTime System currentTimeMillis Connection Connectionconn booleaninUse this conn conn this inUse inUse publicConnectiongetConnection 返回数据库连接conn的接管类 以便截住close方法return Connection Proxy newProxyInstance conn getClass getClassLoader conn getClass getInterfaces this voidclose throwsSQLException 直接关闭连接conn close 数据库连接代理实现2 publicbooleanisInUse returninUse publicObjectinvoke Objectproxy Methodm Object args throwsThrowable Objectobj null 判断是否调用了close的方法 如果调用close方法则把连接置为无用状态if CLOSE METHOD NAME equals m getName setInUse false elseobj m invoke conn args 设置最后一次访问时间 以便及时清除超时的连接lastAccessTime System currentTimeMillis returnobj publiclonggetLastAccessTime returnlastAccessTime publicvoidsetInUse booleaninUse this inUse inUse 实际应用举例之Web框架 问题提出 开发web应用程序时经常需要对上传的文件进行处理 对于用来上传文件的表单其ENCTYPE通常设置为multipart form data 这种类型的表单提交到服务器后是无法通过ServletRequest的getParameter方法来获取表单中的某个域的值 而必须通过解析上传的数据流来获取参数值 因此就要求Web框架本身要屏蔽表单之间的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年低空经济基础设施招商方案报告
- 环保工程师考试模拟试题及参考答案详解
- 客户服务与管理技能测试大全
- 家庭宠物小狗智能训练课程防骗测试与答案指南
- 康复师专业基础测试题及答案全解析
- 快速识别焦虑情绪专业测试与解答
- 家庭防疫安全手册与自测题及答案详解
- 2025年健康科普比赛试题及答案
- 开学职业素养提升测试题及答案解析
- 2025年基础体育理论试题及答案
- 农家书屋各项管理制度
- GB 19193-2025传染病消毒规范
- (12)普通高中技术与工程课程标准日常修订版(2017年版2025年修订)
- 2025年初级银行从业资格之初级公司信贷高分通关题库A4可打印版
- 2025年北京市综合评标专家库专家考试历年参考题库含答案详解(5套)
- 2025年以尽责管理推动价值创造-A股机构投资者赋能上市公司治理升级的实践路径研究报告-财新智库
- 早期胃癌内镜切除术后追加外科手术中国专家共识2025
- 消毒供应室灭菌流程
- 施工现场建筑垃圾处置方案(完整版)
- rc遥控车专业知识培训课件
- 绿篱机安全操作规程培训课件
评论
0/150
提交评论