Javassist是一个能够操作字节码框架,在学习的过程中存在了一些问题,用博客的方式记录下来,希望对大家有所帮助。
一、实例功能
学习的实例来自于 IBM developer 主要功能实现计算一个方式具体的执行时间.
二、代码实例
这是一个基本实例,通过一个参数传入的length,来生成length长度的字符串。(但是该方式存在一个很验证的性能问题,就是当length的长度组件增大时,该方法的效率就会越低),但在此处不必关系方法的效率问题
三、解决方案
1) 第一个中解决方案,也是最直观的方式,就是在进入方法时,记录一个当前时间 start , 当代码执行完成之后,获取当前时间 end , 然后采用 (end - start)的方式,来获取代码执行时间
2) 第二中方式,我们采用Javassit框架来实现:
(1) 使用通过ClassPool 来获取 CtClass对象
(2) 从CtClass对象中,获取buildString()的方法
(3) 为buildString()方法添加代码块
特别说明:
为方法添加代码块,有三种方式可以实现
前两种方式,在实现上都有一定的问题,所以我们采用第三种方式实现,会比较的容易实现
代码如下:
可能会出现的问题:
1. LinkageError 我在实践的过程中,由于想方便,采用了StringBuilderTest.class.getName() 的方法来代替手写的字符串,这个时候,我在使用CtClass.toClass()时出现了异常,异常原因大致为: 一个Class只能被加载一次,因为我们在调用toClass()方法时,会去再加载Class,所以会出现重复加载。
官方文档如下Javassist Tutorial
初步学习就到这里,后面会继续更新关于该框架的学习