Javassist:源代码和空行

时间:2014-09-01 09:37:06

标签: java decompiling instrumentation javassist

美好时光!

我刚刚开始使用Javassist,现在有几点我不明白。

  1. 首先,当我使用ctMethod.insertAt()方法时,我需要从源代码中指定一个行号以插入代码。在类加载阶段正在进行入侵,所以我是对的,javassist包含一个反编译器来将编译的类转换为源代码吗?
  2. 我已准备好一些测试来验证我的变形金刚'工作。他们中的大多数使用以下算法来代替具有指定代码的代码块:

    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());
    

    我尝试使用的方法:enter image description here 请注意,有几个空行:12,16和19。

  3. 我试着

    • 评论第一个块,
    • 而不是第二个块而不是第二个块!!!&#39; line(注释第二个块并在其前面插入替换行),
    • 评论第一行,
    • 而不是第二行,而不是第二行!!!&#39; line(注释第二行并在其前面插入替换行)。

    当我在源代码中指定行号时,它根本不起作用 - 这是结果输出:

    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 类,它显示如下:enter image description here 还有空行的概念。

    我是对的,内部javassist的反编译器消除了空行,当我指定行号时,我需要评估删除空行的行索引吗?

0 个答案:

没有答案