枚举在Java内部是如何表示的?
Java枚举是类。它们被编译为类 下面的示例将如何编译? 它的“类版本”是什么? 确切的分类代码是什么?我想要实际的Java代码枚举在Java内部是如何表示的?,java,enums,Java,Enums,Java枚举是类。它们被编译为类 下面的示例将如何编译? 它的“类版本”是什么? 确切的分类代码是什么?我想要实际的Java代码 public enum Ordinals { FIRST("st"), SECOND("nd"), THIRD("rd"); private String notation; private Ordinals(String notation) { this.notation = notation; }
public enum Ordinals {
FIRST("st"),
SECOND("nd"),
THIRD("rd");
private String notation;
private Ordinals(String notation) {
this.notation = notation;
}
public String getNotation() {
return notation;
}
}
Class version
说明类文件编译时使用的是哪个Java版本。你可能对此不感兴趣
您的
enum
将正常编译,其中Ordinals
隐式扩展了enum
类,并且有3个类级变量,Ordinals
类的所有实例。您可以将enum看作是一个具有类型化常量的类。您可以将代码想象为:
public enum Ordinals {
public static final FIRST = "st";
public static final SECOND = ..;
// ...
private String notation;
private Ordinals(String notation) {
this.notation = notation;
}
public String getNotation() {
return notation;
}
}
该命令可能对您有用,请尝试以下操作:
javap示例.class
:
public final class Example extends java.lang.Enum<Example> {
public static final Example FIRST;
public static final Example SECOND;
public static final Example THIRD;
public static Example[] values();
public static Example valueOf(java.lang.String);
public java.lang.String getNotation();
static {};
}
public final类示例扩展了java.lang.Enum{
先公开静态最终示例;
公共静态最终示例二;
公共静态最终示例三;
公共静态示例[]值();
公共静态示例valueOf(java.lang.String);
public java.lang.String getNotation();
静态{};
}
使用javap-p Ordinals.class
命令,您将获得以下代码:
public final class Ordinals extends java.lang.Enum<Ordinals> {
public static final Ordinals FIRST;
public static final Ordinals SECOND;
public static final Ordinals THIRD;
private java.lang.String notation;
private static final Ordinals[] $VALUES;
public static Ordinals[] values();
public static Ordinals valueOf(java.lang.String);
private Ordinals(java.lang.String);
public java.lang.String getNotation();
static {};
}
如本书第3项所述,
enum
或多或少被视为一个单例,这反映在上述公共最终静态
字段的使用中。每个enum
类都被编译为java.lang.enum
的子类。每个枚举常量都成为该类中的静态final
常量。然后,按照声明顺序,使用所有枚举常量创建一个数组$VALUES
您可以使用命令javap-p-c Ordinals
(在编译的.class文件上)反汇编代码,以了解详细信息
Compiled from "Ordinals.java"
public final class Ordinals extends java.lang.Enum<Ordinals> {
public static final Ordinals FIRST;
public static final Ordinals SECOND;
public static final Ordinals THIRD;
private java.lang.String notation; // your custom field
private static final Ordinals[] $VALUES; // all enum constants
public static Ordinals[] values(); // every enum class has this static method
Code:
0: getstatic #1 // Field $VALUES:[LOrdinals;
3: invokevirtual #2 // Method "[LOrdinals;".clone:()Ljava/lang/Object;
6: checkcast #3 // class "[LOrdinals;"
9: areturn
public static Ordinals valueOf(java.lang.String); // every enum class has this static method
Code:
0: ldc_w #4 // class Ordinals
3: aload_0
4: invokestatic #5 // Method java/lang/Enum.valueOf:(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;
7: checkcast #4 // class Ordinals
10: areturn
private Ordinals(java.lang.String);
Code:
0: aload_0
1: aload_1
2: iload_2
3: invokespecial #6 // Method java/lang/Enum."<init>":(Ljava/lang/String;I)V
6: aload_0
7: aload_3
8: putfield #7 // Field notation:Ljava/lang/String;
11: return
public java.lang.String getNotation();
Code:
0: aload_0
1: getfield #7 // Field notation:Ljava/lang/String;
4: areturn
static {}; // fills the $VALUES array and initializes the static fields corresponding to the enum constants
Code:
0: new #4 // class Ordinals
3: dup
4: ldc #8 // String FIRST
6: iconst_0
7: ldc #9 // String st
9: invokespecial #10 // Method "<init>":(Ljava/lang/String;ILjava/lang/String;)V
12: putstatic #11 // Field FIRST:LOrdinals;
15: new #4 // class Ordinals
18: dup
19: ldc #12 // String SECOND
21: iconst_1
22: ldc #13 // String nd
24: invokespecial #10 // Method "<init>":(Ljava/lang/String;ILjava/lang/String;)V
27: putstatic #14 // Field SECOND:LOrdinals;
30: new #4 // class Ordinals
33: dup
34: ldc #15 // String THIRD
36: iconst_2
37: ldc #16 // String rd
39: invokespecial #10 // Method "<init>":(Ljava/lang/String;ILjava/lang/String;)V
42: putstatic #17 // Field THIRD:LOrdinals;
45: iconst_3
46: anewarray #4 // class Ordinals
49: dup
50: iconst_0
51: getstatic #11 // Field FIRST:LOrdinals;
54: aastore
55: dup
56: iconst_1
57: getstatic #14 // Field SECOND:LOrdinals;
60: aastore
61: dup
62: iconst_2
63: getstatic #17 // Field THIRD:LOrdinals;
66: aastore
67: putstatic #1 // Field $VALUES:[LOrdinals;
70: return
}
从“Ordinals.java”编译而来
公共最终类序号扩展了java.lang.Enum{
公共静态最终序号优先;
公共静态最终序号第二;
公共静态最终序号第三;
私有java.lang.String表示法;//自定义字段
私有静态最终序号[]$VALUES;//所有枚举常量
public static Ordinals[]values();//每个枚举类都有此静态方法
代码:
0:getstatic#1//字段$VALUES:[LOrdinals;
3:invokevirtual#2//方法“[LOrdinals;”。克隆:()Ljava/lang/Object;
6:checkcast#3//class“[LOrdinals
9:轮到你了
public static Ordinals valueOf(java.lang.String);//每个枚举类都有这个静态方法
代码:
0:ldc#u w#4//类序数
3:aload_0
4:invokestatic#5//方法java/lang/Enum.valueOf:(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;
7:checkcast#4//类序数
10:轮到你了
私有序数(java.lang.String);
代码:
0:aload_0
1:aload_1
2:iload_2
3:invokespecial#6//方法java/lang/Enum.“:(Ljava/lang/String;I)V
6:aload_0
7:aload_3
8:putfield#7//字段表示法:Ljava/lang/String;
11:返回
public java.lang.String getNotation();
代码:
0:aload_0
1:getfield#7//字段表示法:Ljava/lang/String;
4:轮到你了
static{};//填充$VALUES数组并初始化与枚举常量对应的静态字段
代码:
0:新的#4//类序数
3:dup
4:ldc#8//字符串优先
6:iconst_0
7:ldc#9//String街
9:invokespecial#10//Method“”:(Ljava/lang/String;ILjava/lang/String;)V
12:putstatic#11//字段优先:LOrdinals;
15:新的#4//类序数
18:dup
19:ldc#12//字符串秒
21:iconst_1
22:ldc#13//字符串nd
24:invokespecial#10//Method“”:(Ljava/lang/String;ILjava/lang/String;)V
27:putstatic#14//第二个字段:LOrdinals;
30:新的#4//类序数
33:dup
34:ldc#15//String THIRD
36:iconst_2
37:ldc#16//String路
39:invokespecial#10//Method“”:(Ljava/lang/String;ILjava/lang/String;)V
42:putstatic#17//第三个字段:LOrdinals;
45:iconst_3
46:anewarray#4//类序数
49:dup
50:iconst_0
51:getstatic#11//字段优先:LOrdinals;
54:aastore
55:dup
56:iconst_1
57:getstatic#14//第二个字段:LOrdinals;
60:aastore
61:dup
62:iconst_2
63:getstatic#17//第三个字段:LOrdinals;
66:aastore
67:putstatic#1//字段$value:[LOrdinals;
70:返回
}
这将转换回Java
public final class Ordinals extends java.lang.Enum<Ordinals> {
public static final Ordinals FIRST;
public static final Ordinals SECOND;
public static final Ordinals THIRD;
private String notation;
private static final Ordinals[] $VALUES;
public static Ordinals[] values() {
return $VALUES.clone();
}
public static Ordinals valueOf(String name) {
return (Ordinals) Enum.valueOf(Ordinals.class, name);
}
private Ordinals(String name, int ordinal, String notation) {
super(name, ordinal);
this.notation = notation
}
static {
FIRST = new Ordinals("FIRST", 0, "st");
SECOND = new Ordinals("SECOND", 1, "nd");
THIRD = new Ordinals("THIRD", 2, "rd");
Ordinals[] $VALUES = new Ordinals[3];
$VALUES[0] = FIRST;
$VALUES[1] = SECOND;
$VALUES[2] = THIRD;
Ordinals.$VALUES = $VALUES;
}
}
public final类序号扩展了java.lang.Enum{
公共静态最终序号优先;
公共静态最终序号第二;
公共静态最终序号第三;
私有字符串表示法;
私有静态最终序号[]$值;
公共静态序号[]值(){
返回$VALUES.clone();
}
公共静态序号valueOf(字符串名称){
返回(序号)枚举值(序号类,名称);
}
私有序数(字符串名称、整数序数、字符串表示法){
超级(北美)
public final class Ordinals extends java.lang.Enum<Ordinals> {
public static final Ordinals FIRST;
public static final Ordinals SECOND;
public static final Ordinals THIRD;
private String notation;
private static final Ordinals[] $VALUES;
public static Ordinals[] values() {
return $VALUES.clone();
}
public static Ordinals valueOf(String name) {
return (Ordinals) Enum.valueOf(Ordinals.class, name);
}
private Ordinals(String name, int ordinal, String notation) {
super(name, ordinal);
this.notation = notation
}
static {
FIRST = new Ordinals("FIRST", 0, "st");
SECOND = new Ordinals("SECOND", 1, "nd");
THIRD = new Ordinals("THIRD", 2, "rd");
Ordinals[] $VALUES = new Ordinals[3];
$VALUES[0] = FIRST;
$VALUES[1] = SECOND;
$VALUES[2] = THIRD;
Ordinals.$VALUES = $VALUES;
}
}
public final class Ordinals extends java.lang.Enum<Ordinals> {
public static final Ordinals FIRST;
public static final Ordinals SECOND;
public static final Ordinals THIRD;
private java.lang.String notation;
private static final Ordinals[] $VALUES;
public static Ordinals[] values();
public static Ordinals valueOf(java.lang.String);
private Ordinals(java.lang.String);
public java.lang.String getNotation();
static {};
}