美好时光!
我刚刚开始使用Javassist,现在有几点我不明白。
ctMethod.insertAt()
方法时,我需要从源代码中指定一个行号以插入代码。在类加载阶段正在进行入侵,所以我是对的,javassist包含一个反编译器来将编译的类转换为源代码吗?我已准备好一些测试来验证我的变形金刚'工作。他们中的大多数使用以下算法来代替具有指定代码的代码块:
CodeAttribute codeAttribute = ctMethod.getMethodInfo().getCodeAttribute();
LineNumberAttribute lineNumberAttribute = (LineNumberAttribute) codeAttribute.getAttribute(LineNumberAttribute.tag);
int startPC = lineNumberAttribute.toStartPc(startLine);
int endPC = lineNumberAttribute.toStartPc(endLine);
byte[] code = codeAttribute.getCode();
for (int i = startPC; i < endPC; i++) {
code[i] = CodeAttribute.NOP;
}
...
ctMethod.insertAt(startLine, wrappedCode.toString());
我尝试使用的方法: 请注意,有几个空行:12,16和19。
我试着
当我在源代码中指定行号时,它根本不起作用 - 这是结果输出:
Test block 1 line 1
Test block 1 line 2
Test block 1 line 3
Instead of the second block!!!
Test block 2 line 1
Test block 2 line 2
Test block 2 line 3
Test single line 1
Test single line 2
Instead of the second line!!!
但是当我将行号设置为没有空行时,一切都按预期工作。 我试图用JD反编译器反编译 Sleeping 类,它显示如下: 还有空行的概念。
我是对的,内部javassist的反编译器消除了空行,当我指定行号时,我需要评估删除空行的行索引吗?