首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用javap读取字节码

使用javap读取字节码
EN

Stack Overflow用户
提问于 2016-03-31 20:18:48
回答 2查看 2.1K关注 0票数 3

我在互联网上读到java编译

代码语言:javascript
复制
public class Test {
    private String s = "TESTTEST";
}

代码语言:javascript
复制
public class Test {
    private String s;

    public Test() {
        s = "TESTTEST";
    }
}

我说的对吗?

现在我试着自己去理解这一点。因此,我通过调用Test.java来编译类

代码语言:javascript
复制
javac Test.java

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

因此,我尝试在字节码中看到编译器的重构,我在前面提到过(解密在构造函数中)。但是怎么做呢?javap是正确的工具吗?如果是,用什么参数?

谢谢你的帮忙!

编辑:

好的,到目前为止谢谢!请你解释一下如何读取javap -c Test的输出

代码语言:javascript
复制
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
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-31 20:32:59

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

代码语言:javascript
复制
class Test {
    private String s = "TESTTEST";
    Test() {
    }
    Test(int x) {
    }
}
代码语言:javascript
复制
javap -c -p Test.class
代码语言:javascript
复制
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
}

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

代码语言:javascript
复制
<constructor> {
    super();              // Instructions: 0, 1
    this.s = "TESTTEST";  // Instructions: 4, 5, 7
    return;               // Instructions: 10
}

教您字节码超出了StackOverflow的范围。有关字节码说明的完整列表,请参见Java虚拟机指令集

票数 4
EN

Stack Overflow用户

发布于 2020-08-05 09:17:32

jclasslib字节码查看器的到来给您带来了挑战和机遇。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36342953

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档