不完整的Java字节码

4

您好,我有以下的Java代码:

public class A{
private String B="test_string";
private int AA;
public int C;
private int method1()
{
    int a;
    a=0;
    return a;
}


private int method1(int c, String d)
{
    int a;
    a=c;
    return a;
}
}

但是当我使用javap -c命令获取等效的字节码时,我得到了以下内容:

    Compiled from "A.java"
public class A extends java.lang.Object{
public int C;

public A();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   aload_0
   5:   ldc #2; //String test_string
   7:   putfield    #3; //Field B:Ljava/lang/String;
   10:  return

}

我对这里的字节码不太清楚,因为私有变量和方法声明在哪里呢?

有人能给我解释一下吗?

1个回答

12

要显示私有成员,您需要使用-p选项:

javap -c -p A

然后您将看到所有内容:

Compiled from "A.java"
public class A {
  private java.lang.String B;

  private int AA;

  public int C;

  public A();
    Code:
       0: aload_0       
       1: invokespecial #1        // Method java/lang/Object."<init>":()V
       4: aload_0       
       5: ldc           #2        // String test_string
       7: putfield      #3        // Field B:Ljava/lang/String;
      10: return        

  private int method1();
    Code:
       0: iconst_0      
       1: istore_1      
       2: iload_1       
       3: ireturn       

  private int method1(int, java.lang.String);
    Code:
       0: iload_1       
       1: istore_3      
       2: iload_3       
       3: ireturn       
}

为什么我在私有方法中看不到变量名?我可以看到类字段名。 - P basak
@Pbasak:使用“-v”获取详细信息,这将显示本地变量名称。(这不是公共/私有问题 - 它是本地变量与字段之间的区别。)您还可能需要使用“-g”编译,以便所有本地变量名称都包含在内。 - Jon Skeet
使用-v选项并不能包含变量名,只有一些行号表,但是使用-g编译可以实现。 - P basak
1
@Pbasak:好的,-v选项只会显示变量名,但前提是它们在类文件中。你需要在脑海中区分“编译器提供的信息”和“javap显示的信息”之间的差异——后者显然必须是前者的子集。 - Jon Skeet
我明白了,这可能就是反编译器无法重现方法的私有变量名称的原因。 - P basak
@Pbasak:如果他们读取的文件中没有这些信息,那么就不行。但是如果编译器在类文件中包含了这些信息,他们就可以了——这就是“-g”标志的作用。 - Jon Skeet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接