0

我无法理解某些 Java 字节码指令的用法,部分原因是缺乏示例。相反,我使用javac或 Jasmin 来编译一些常规的 Java 代码,然后我使用javap -c来检查生成的字节码。

我的项目建立在为我优化字节码的框架上,因此我自己的代码生成器不必为我管理常量池。由于javap输出包含对常量池的大量引用,因此如果我自己不必使用这些引用,那并不能真正清除用法。

有没有办法在没有符号表(或对它的任何引用)的情况下获得反汇编的字节码?

为了详细说明,假设我们有以下代码:

public class MyConcatCode {
    public static void main(String[] args){
        String a ="Hello ";
        String b ="World!";
        String c = new StringBuilder().append(a).append(b).toString();
    }
}   

这解决了:

...
       0: ldc           #7                  // String Hello
       2: astore_1
       3: ldc           #9                  // String World!
       5: astore_2
       6: new           #11                 // class java/lang/StringBuilder
       9: dup
      10: invokespecial #13                 // Method java/lang/StringBuilder."<init>":()V
      13: aload_1
      14: invokevirtual #14                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      17: aload_2
      18: invokevirtual #14                 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      21: invokevirtual #18                 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
      24: astore_3
      25: return
...

但我宁愿拥有以下内容:

...
       0: ldc Hello
       2: astore_1
       3: ldc World!
       5: astore_2
       6: new java/lang/StringBuilder
       9: dup
      10: invokespecial java/lang/StringBuilder."<init>":()V
      13: aload_1
      14: invokevirtual java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      17: aload_2
      18: invokevirtual java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
      21: invokevirtual java/lang/StringBuilder.toString:()Ljava/lang/String;
      24: astore_3
      25: return
...

如果像提供给我的框架一样,编译器在生成第二个示例中描述的字节码后创建常量池,那么应该可以获得根本不包含符号表的字节码,对吧?

4

1 回答 1

0

据我了解您的问题,您只是在寻找不打印常量池的字节码查看器。例如,它不会在常量池中打印对字符串的引用,而是将字符串内联。

  • 对象 web asm 包含一个实用程序类,用于对提供的输入类进行反汇编。只需下载asm jar ( hotlink ) 和包含该实用程序的asm-util jar ( hotlink )。使用类路径上的这两个 jar,运行org.objectweb.asm.util.Textifier该类并提供要反汇编的类文件的路径。
    java -jar -cp asm-8.0.1.jar:asm-util-8.0.1.jar org.objectweb.asm.util.Textifier /path/to/your/file.class

  • 字节码查看器是在视图菜单中处理字节码的强大工具,您可以选择“字节码”选项。他们的代表为您解决了参考。

  • 我认为Krakatau应该以同样的方式工作,但由于我不喜欢他们的语法和 python,我从来没有深入研究过它。

于 2020-04-16T17:04:44.417 回答