Java编程的动态性, 第4部分: 用Javassist进行类转换 - 编程入门网
做
来做使用 Javassist 操作类字节码以得到同样的效果看起来应该不难。Javassist 提供 了在方法的开始和结束位置添加代码的方法,别忘了,我在为该方法中加入计时信息就是这 么做的。 不过,还是有障碍。在描述 Javassist 是如何让您添加代码时,我提到添加的代码不能 引用在方法中其他地方定义的局部变量。这种限制使我不能在 Javassist 中使用在源代码中 使用的同样方法实现计时代码,在这种情况下,我在开始时添加的代码中定义了一个新的局 部变量,并在结束处添加的代码中引用这个变量。 那么还有其他方法可以得到同样的效果吗?是的,我 可以在类中添加一个新的成员字段 ,并使用这个字段而不是局部变量。不过,这是一种糟糕的解决方案,在一般性的使用中有 一些限制。例如,考虑在一个递归方法中会发生的事情。每次方法调用自身时,上次保存的 开始时间值就会被覆盖并且丢失。 幸运的是有一种更简洁的解决方案。我可以保持原来方法的代码不变,只改变方法名,然 后用原来的方法名增加一个新方法。这个 拦截器(interceptor)方法可以使用与原来方法同 样的签名,包括返回同样的值。清单 3 展示了通过这种方法改编后源代码看上去的样子: 清单 3. 在源代码中添加一个拦截器方法
通过 Javassist 可以很好地利用这种使用拦截器方法的方法。因为整个方法是一个块, 所以我可以毫无问题地在正文中定义并且使用局部变量。为拦截器方法生成源代码也很容易 -- 对于任何可能的方法,只需要几个替换。 Java编程的动态性, 第4部分: 用Javassist进行类转换(3)时间:2011-04-09 IBM Dennis M. Sosnoski运行拦截 实现添加方法计时的代码要用到在 Javassist 基础中描述的一些 Javassist API。清单 4 展示了该代码,它是一个带有两个命令行参数的应用程序,这两个参数分别给出类名和要 计时的方法名。main() 方法的正文只给出类信息,然后将它传递给 addTiming() 方法以处 理实际的修改。addTiming() 方法首先通过在名字后面附加“ $impl” 重命名现有的方法, 接着用原来的方法名创建该方法的一个拷贝。然后它用含有对经过重命名的原方法的调用的 计时代码替换拷贝方法的正文。 清单4. 用 Javassist 添加拦截器方法
|
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |