代码之家  ›  专栏  ›  技术社区  ›  mrbela

使用javap读取字节码

  •  3
  • mrbela  · 技术社区  · 8 年前

    我在互联网上读到java编译

    public class Test {
        private String s = "TESTTEST";
    }
    

    public class Test {
        private String s;
    
        public Test() {
            s = "TESTTEST";
        }
    }
    

    我说得对吗?

    现在我试着自己去理解这一点。所以我编译了这个类 Test.java 通过调用

    javac Test.java
    

    之后,我读到了我可以使用的东西 javap 读取编译后的代码(=字节码)。

    因此,我尝试在字节代码中看到编译器的重构,我在上面提到过(decoration在构造函数中)。但如何??是 java协议 正确的工具?如果是,使用哪些参数?

    谢谢你的帮助!

    编辑:

    好的,谢谢你!你能解释一下如何阅读 javap -c Test ?

    C:\Users\MyName\Desktop>javap -c Test
    Compiled from "Test.java"
    public class Test {
      public Test();
        Code:
           0: aload_0
           1: invokespecial #1                  // Method java/lang/Object."<init>":()V
           4: aload_0
           5: ldc           #2                  // String TESTTEST
           7: putfield      #3                  // Field s:Ljava/lang/String;
          10: return
    }
    
    2 回复  |  直到 8 年前
        1
  •  4
  •   Andreas dfa    8 年前

    因为你的领域是 private ,您还需要提供 -p 参数以查看私人成员。为了查看多个构造函数会发生什么,我添加了一个额外的构造函数。

    class Test {
        private String s = "TESTTEST";
        Test() {
        }
        Test(int x) {
        }
    }
    
    javap -c -p Test.class
    
    class Test {
      private java.lang.String s;
    
      Test();
        Code:
           0: aload_0
           1: invokespecial #10                 // Method java/lang/Object."<init>":()V
           4: aload_0
           5: ldc           #12                 // String TESTTEST
           7: putfield      #14                 // Field s:Ljava/lang/String;
          10: return
    
      Test(int);
        Code:
           0: aload_0
           1: invokespecial #10                 // Method java/lang/Object."<init>":()V
           4: aload_0
           5: ldc           #12                 // String TESTTEST
           7: putfield      #14                 // Field s:Ljava/lang/String;
          10: return
    }
    

    在两个构造函数中,这基本上是:

    <constructor> {
        super();              // Instructions: 0, 1
        this.s = "TESTTEST";  // Instructions: 4, 5, 7
        return;               // Instructions: 10
    }
    

    教你字节码超出了StackOverflow的范围。看见 The Java Virtual Machine Instruction Set 获取字节码指令的完整列表。

        2
  •  0
  •   BertKing    4 年前

    随着 jclasslib Bytecode viewer 为您带来挑战和机遇。

    推荐文章