![]() |
1
10
简单的部分方法 insertAt(int lineNumber, String src) 存在于CtMethod对象中允许注入在 src公司 之前 给定行中的代码。 例如,以以下(简单的)示例程序为例:
通过简单编码(请记住,方法变量必须是的CtMethod表示 打印 方法):
将在类中注入一条新的sysout指令。新类的输出将是:
最难的部分Javassist并没有提供一种简单的方法来删除一行代码,所以如果你真的想替换它,你别无选择,只能破解它。 怎么做?好吧,让我把你介绍给你的新朋友(如果你还不知道的话) CodeAttribute 对象 CodeAttribute对象负责保存表示方法流的字节码。除此之外,该代码属性还有另一个名为 LineNumberAttribute 这有助于将行号映射到字节码数组中。所以总结这个对象就有了你需要的一切! 下面例子中的想法很简单。将字节码数组中的字节与应删除的行建立关系,并用无操作代码替换这些字节。 再一次,方法是方法的CtMethod表示 打印
在中运行此修改 起初的 TestSubject类,将导致一个具有以下输出的注入类:
总结当您需要添加一行并保留现有行时,只需要使用中给出的示例 容易的部分 如果要替换该行,则必须首先使用中给出的示例删除现有行 坚硬的部分 然后使用第一示例注入新的行。 还要记住,在我假设您已经熟悉javassist的基本知识的示例中,只显示了有趣的部分,而不是全部交易。这就是为什么,例如,在示例中没有ctClass.writeFile……你仍然需要这样做,我只是忽略了它,因为我希望你应该知道你必须这样做。 如果您在代码示例中需要任何额外的帮助,只需询问即可。我很乐意帮忙。 |
|
user29759326 · 如何返回递归函数中的最后一个值? 5 月前 |
|
malife89 · 将java中的字符串读取为正确的日期格式 5 月前 |
![]() |
Tim · 在java中,有没有更快的方法将字节数组写入文件? 5 月前 |
![]() |
rudraraj · java中未声明最终变量 6 月前 |
![]() |
Bala Ji · 以下BFS的实施效率如何? 6 月前 |