Java无法构造描述符,用javap反汇编的枚举不显示构造函数参数

当我用

javap反汇编枚举时,枚举的隐式构造函数参数似乎缺失了,我无法弄清楚为什么.

这是一个枚举:

enum Foo { X }

我使用以下命令编译和反汇编(在Java 8u60上):

javac Foo.java && javap -c -p Foo

这是我得到的输出:

final class Foo extends java.lang.Enum {

public static final Foo X;

private static final Foo[] $VALUES;

public static Foo[] values();

Code:

0: getstatic #1 // Field $VALUES:[LFoo;

3: invokevirtual #2 // Method "[LFoo;".clone:()Ljava/lang/Object;

6: checkcast #3 // class "[LFoo;"

9: areturn

public static Foo valueOf(java.lang.String);

Code:

0: ldc #4 // class Foo

2: aload_0

3: invokestatic #5 // Method java/lang/Enum.valueOf:(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;

6: checkcast #4 // class Foo

9: areturn

private Foo(); //

Code:

0: aload_0

1: aload_1

2: iload_2

3: invokespecial #6 // Method java/lang/Enum."":(Ljava/lang/String;I)V

6: return

static {};

Code:

0: new #4 // class Foo

3: dup

4: ldc #7 // String X

6: iconst_0

7: invokespecial #8 // Method "":(Ljava/lang/String;I)V

10: putstatic #9 // Field X:LFoo;

13: iconst_1

14: anewarray #4 // class Foo

17: dup

18: iconst_0

19: getstatic #9 // Field X:LFoo;

22: aastore

23: putstatic #1 // Field $VALUES:[LFoo;

26: return

}

我的困惑是用于实例化每个枚举常量的私有构造函数.反汇编显示它不带参数(私有Foo();),但肯定会带参数.例如,您可以看到读取传递的枚举常量名称和序号以及this指针的加载指令,并将它们传递给the superclass constructor,这需要它们.静态初始化程序块中的代码还显示它在调用构造函数之前将这些参数压入堆栈.

现在我假设这只是javap中一个不起眼的错误,但是当我使用Eclipse的编译器编译完全相同的枚举并使用javap反汇编时,构造函数完全相同,除了参数显示:

final class Foo extends java.lang.Enum {

public static final Foo X;

private static final Foo[] ENUM$VALUES;

static {};

Code:

0: new #1 // class Foo

3: dup

4: ldc #12 // String X

6: iconst_0

7: invokespecial #13 // Method "":(Ljava/lang/String;I)V

10: putstatic #17 // Field X:LFoo;

13: iconst_1

14: anewarray #1 // class Foo

17: dup

18: iconst_0

19: getstatic #17 // Field X:LFoo;

22: aastore

23: putstatic #19 // Field ENUM$VALUES:[LFoo;

26: return

private Foo(java.lang.String, int); //

Code:

0: aload_0

1: aload_1

2: iload_2

3: invokespecial #23 // Method java/lang/Enum."":(Ljava/lang/String;I)V

6: return

public static Foo[] values();

Code:

0: getstatic #19 // Field ENUM$VALUES:[LFoo;

3: dup

4: astore_0

5: iconst_0

6: aload_0

7: arraylength

8: dup

9: istore_1

10: anewarray #1 // class Foo

13: dup

14: astore_2

15: iconst_0

16: iload_1

17: invokestatic #27 // Method java/lang/System.arraycopy:(Ljava/lang/Object;ILjava/lang/Object;II)V

20: aload_2

21: areturn

public static Foo valueOf(java.lang.String);

Code:

0: ldc #1 // class Foo

2: aload_0

3: invokestatic #35 // Method java/lang/Enum.valueOf:(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;

6: checkcast #1 // class Foo

9: areturn

}

我的问题是:javac编译的枚举和Eclipse编译的枚举之间有什么不同,导致javap不显示javac编译的枚举的构造函数参数?这是一个错误(在javap,javac或Eclipse中)?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值