枚举
在kotlin中,枚举相当于是一个静态的变量。虽然是以class的信使编写和定义,但是不能实例化。
枚举的使用
enum class TestClass {
A{
override var value = TestClassA("AA")
override fun test() {
println("test called ${value.name}")
}
};
open var value:TestClassA = TestClassA("null")
open abstract fun test():Unit
}
fun main(args:Array<String>){
println(TestClass.A.value)
}
以上代码是一个很简单的实例,我们来看看他相对应的字节码文件。
// ================com/eathemeat/cabinetflow/TestClassA.class =================
// class version 52.0 (52)
// access flags 0x31
public final class com/eathemeat/cabinetflow/TestClassA {
// access flags 0x12
private final Ljava/lang/String; name
@Lorg/jetbrains/annotations/NotNull;() // invisible
// access flags 0x11
public final getName()Ljava/lang/String;
@Lorg/jetbrains/annotations/NotNull;() // invisible
L0
LINENUMBER 4 L0
ALOAD 0
GETFIELD com/eathemeat/cabinetflow/TestClassA.name : Ljava/lang/String;
ARETURN
L1
LOCALVARIABLE this Lcom/eathemeat/cabinetflow/TestClassA; L0 L1 0
MAXSTACK = 1
MAXLOCALS = 1
// access flags 0x1
public <init>(Ljava/lang/String;)V
// annotable parameter count: 1 (visible)
// annotable parameter count: 1 (invisible)
@Lorg/jetbrains/annotations/NotNull;() // invisible, parameter 0
L0
ALOAD 1
LDC "name"
INVOKESTATIC kotlin/jvm/internal/Intrinsics.checkNotNullParameter (Ljava/lang/Object;Ljava/lang/String;)V
L1
LINENUMBER 4 L1
ALOAD 0
INVOKESPECIAL java/lang/Object.<init> ()V
ALOAD 0
ALOAD 1
PUTFIELD com/eathemeat/cabinetflow/TestClassA.name : Ljava/lang/String;
RETURN
L2
LOCALVARIABLE this Lcom/eathemeat/cabinetflow/TestClassA; L0 L2 0
LOCALVARIABLE name Ljava/lang/String; L0 L2 1
MAXSTACK = 2
MAXLOCALS = 2
// access flags 0x11
public final component1()Ljava/lang/String;
@Lorg/jetbrains/annotations/NotNull;() // invisible
L0
ALOAD 0
GETFIELD com/eathemeat/cabinetflow/TestClassA.name : Ljava/lang/String;
ARETURN
L1
LOCALVARIABLE this Lcom/eathemeat/cabinetflow/TestClassA; L0 L1 0
MAXSTACK = 1
MAXLOCALS = 1
// access flags 0x11
public final copy(Ljava/lang/String;)Lcom/eathemeat/cabinetflow/TestClassA;
@Lorg/jetbrains/annotations/NotNull;() // invisible
// annotable parameter count: 1 (visible)
// annotable parameter count: 1 (invisible)
@Lorg/jetbrains/annotations/NotNull;() // invisible, parameter 0
L0
ALOAD 1
LDC "name"
INVOKESTATIC kotlin/jvm/internal/Intrinsics.checkNotNullParameter (Ljava/lang/Object;Ljava/lang/String;)V
NEW com/eathemeat/cabinetflow/TestClassA
DUP
ALOAD 1
INVOKESPECIAL com/eathemeat/cabinetflow/TestClassA.<init> (Ljava/lang/String;)V
ARETURN
L1
LOCALVARIABLE this Lcom/eathemeat/cabinetflow/TestClassA; L0 L1 0
LOCALVARIABLE name Ljava/lang/String; L0 L1 1
MAXSTACK = 3
MAXLOCALS = 2
// access flags 0x1009
public static synthetic copy$default(Lcom/eathemeat/cabinetflow/TestClassA;Ljava/lang/String;ILjava/lang/Object;)Lcom/eathemeat/cabinetflow/TestClassA;
ILOAD 2
ICONST_1
IAND
IFEQ L0
ALOAD 0
GETFIELD com/eathemeat/cabinetflow/TestClassA.name : Ljava/lang/String;
ASTORE 1
L0
ALOAD 0
ALOAD 1
INVOKEVIRTUAL com/eathemeat/cabinetflow/TestClassA.copy (Ljava/lang/String;)Lcom/eathemeat/cabinetflow/TestClassA;
ARETURN
MAXSTACK = 2
MAXLOCALS = 4
// access flags 0x1
public toString()Ljava/lang/String;
@Lorg/jetbrains/annotations/NotNull;() // invisible
NEW java/lang/StringBuilder
DUP
INVOKESPECIAL java/lang/StringBuilder.<init> ()V
LDC "TestClassA(name="
INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
ALOAD 0
GETFIELD com/eathemeat/cabinetflow/TestClassA.name : Ljava/lang/String;
INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
LDC ")"
INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
INVOKEVIRTUAL java/lang/StringBuilder.toString ()Ljava/lang/String;
ARETURN
MAXSTACK = 2
MAXLOCALS = 1
// access flags 0x1
public hashCode()I
ALOAD 0
GETFIELD com/eathemeat/cabinetflow/TestClassA.name : Ljava/lang/String;
DUP
IFNULL L0
INVOKEVIRTUAL java/lang/Object.hashCode ()I
GOTO L1
L0
POP
ICONST_0
L1
IRETURN
MAXSTACK = 2
MAXLOCALS = 1
// access flags 0x1
public equals(Ljava/lang/Object;)Z
@Lorg/jetbrains/annotations/Nullable;() // invisible, parameter 0
ALOAD 0
ALOAD 1
IF_ACMPEQ L0
ALOAD 1
INSTANCEOF com/eathemeat/cabinetflow/TestClassA
IFEQ L1
ALOAD 1
CHECKCAST com/eathemeat/cabinetflow/TestClassA
ASTORE 2
ALOAD 0
GETFIELD com/eathemeat/cabinetflow/TestClassA.name : Ljava/lang/String;
ALOAD 2
GETFIELD com/eathemeat/cabinetflow/TestClassA.name : Ljava/lang/String;
INVOKESTATIC kotlin/jvm/internal/Intrinsics.areEqual (Ljava/lang/Object;Ljava/lang/Object;)Z
IFEQ L1
L0
ICONST_1
IRETURN
L1
ICONST_0
IRETURN
MAXSTACK = 2
MAXLOCALS = 3
@Lkotlin/Metadata;(mv={1, 6, 0}, k=1, d1={"\u0000\"\n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0000\n\u0002\u0010\u000e\n\u0002\u0008\u0006\n\u0002\u0010\u000b\n\u0002\u0008\u0002\n\u0002\u0010\u0008\n\u0002\u0008\u0002\u0008\u0086\u0008\u0018\u00002\u00020\u0001B\r\u0012\u0006\u0010\u0002\u001a\u00020\u0003\u00a2\u0006\u0002\u0010\u0004J\u0009\u0010\u0007\u001a\u00020\u0003H\u00c6\u0003J\u0013\u0010\u0008\u001a\u00020\u00002\u0008\u0008\u0002\u0010\u0002\u001a\u00020\u0003H\u00c6\u0001J\u0013\u0010\u0009\u001a\u00020\n2\u0008\u0010\u000b\u001a\u0004\u0018\u00010\u0001H\u00d6\u0003J\u0009\u0010\u000c\u001a\u00020\rH\u00d6\u0001J\u0009\u0010\u000e\u001a\u00020\u0003H\u00d6\u0001R\u0011\u0010\u0002\u001a\u00020\u0003\u00a2\u0006\u0008\n\u0000\u001a\u0004\u0008\u0005\u0010\u0006\u00a8\u0006\u000f"}, d2={"Lcom/eathemeat/cabinetflow/TestClassA;", "", "name", "", "(Ljava/lang/String;)V", "getName", "()Ljava/lang/String;", "component1", "copy", "equals", "", "other", "hashCode", "", "toString", "app_debug"})
// compiled from: Wahhhhh.kt
}
// ================com/eathemeat/cabinetflow/TestClass.class =================
// class version 52.0 (52)
// access flags 0x4421
// signature Ljava/lang/Enum<Lcom/eathemeat/cabinetflow/TestClass;>;
// declaration: com/eathemeat/cabinetflow/TestClass extends java.lang.Enum<com.eathemeat.cabinetflow.TestClass>
public abstract enum com/eathemeat/cabinetflow/TestClass extends java/lang/Enum {
// access flags 0x4019
public final static enum Lcom/eathemeat/cabinetflow/TestClass; A
// access flags 0x8
static <clinit>()V
ICONST_1
ANEWARRAY com/eathemeat/cabinetflow/TestClass
DUP
DUP
ICONST_0
NEW com/eathemeat/cabinetflow/TestClass$A
DUP
LDC "A"
ICONST_0
INVOKESPECIAL com/eathemeat/cabinetflow/TestClass$A.<init> (Ljava/lang/String;I)V
DUP
PUTSTATIC com/eathemeat/cabinetflow/TestClass.A : Lcom/eathemeat/cabinetflow/TestClass;
AASTORE
PUTSTATIC com/eathemeat/cabinetflow/TestClass.$VALUES : [Lcom/eathemeat/cabinetflow/TestClass;
RETURN
MAXSTACK = 8
MAXLOCALS = 0
// access flags 0x101A
private final static synthetic [Lcom/eathemeat/cabinetflow/TestClass; $VALUES
// access flags 0x2
private Lcom/eathemeat/cabinetflow/TestClassA; value
@Lorg/jetbrains/annotations/NotNull;() // invisible
// access flags 0x1
public getValue()Lcom/eathemeat/cabinetflow/TestClassA;
@Lorg/jetbrains/annotations/NotNull;() // invisible
L0
LINENUMBER 14 L0
ALOAD 0
GETFIELD com/eathemeat/cabinetflow/TestClass.value : Lcom/eathemeat/cabinetflow/TestClassA;
ARETURN
L1
LOCALVARIABLE this Lcom/eathemeat/cabinetflow/TestClass; L0 L1 0
MAXSTACK = 1
MAXLOCALS = 1
// access flags 0x1
public setValue(Lcom/eathemeat/cabinetflow/TestClassA;)V
// annotable parameter count: 1 (visible)
// annotable parameter count: 1 (invisible)
@Lorg/jetbrains/annotations/NotNull;() // invisible, parameter 0
L0
ALOAD 1
LDC "<set-?>"
INVOKESTATIC kotlin/jvm/internal/Intrinsics.checkNotNullParameter (Ljava/lang/Object;Ljava/lang/String;)V
L1
LINENUMBER 14 L1
ALOAD 0
ALOAD 1
PUTFIELD com/eathemeat/cabinetflow/TestClass.value : Lcom/eathemeat/cabinetflow/TestClassA;
RETURN
L2
LOCALVARIABLE this Lcom/eathemeat/cabinetflow/TestClass; L0 L2 0
LOCALVARIABLE <set-?> Lcom/eathemeat/cabinetflow/TestClassA; L0 L2 1
MAXSTACK = 2
MAXLOCALS = 2
// access flags 0x401
public abstract test()V
LOCALVARIABLE this Lcom/eathemeat/cabinetflow/TestClass; L0 L1 0
// access flags 0x2
// signature ()V
// declaration: void <init>()
private <init>(Ljava/lang/String;I)V
L0
LINENUMBER 6 L0
ALOAD 0
ALOAD 1
ILOAD 2
INVOKESPECIAL java/lang/Enum.<init> (Ljava/lang/String;I)V
L1
LINENUMBER 14 L1
ALOAD 0
NEW com/eathemeat/cabinetflow/TestClassA
DUP
LDC "null"
INVOKESPECIAL com/eathemeat/cabinetflow/TestClassA.<init> (Ljava/lang/String;)V
PUTFIELD com/eathemeat/cabinetflow/TestClass.value : Lcom/eathemeat/cabinetflow/TestClassA;
RETURN
L2
LOCALVARIABLE this Lcom/eathemeat/cabinetflow/TestClass; L0 L2 0
LOCALVARIABLE $enum$name Ljava/lang/String; L0 L2 1
LOCALVARIABLE $enum$ordinal I L0 L2 2
MAXSTACK = 4
MAXLOCALS = 3
// access flags 0x1001
public synthetic <init>(Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
L0
LINENUMBER 6 L0
ALOAD 0
ALOAD 1
ILOAD 2
INVOKESPECIAL com/eathemeat/cabinetflow/TestClass.<init> (Ljava/lang/String;I)V
RETURN
L1
LOCALVARIABLE this Lcom/eathemeat/cabinetflow/TestClass; L0 L1 0
LOCALVARIABLE $enum$name Ljava/lang/String; L0 L1 1
LOCALVARIABLE $enum$ordinal I L0 L1 2
LOCALVARIABLE $constructor_marker Lkotlin/jvm/internal/DefaultConstructorMarker; L0 L1 3
MAXSTACK = 3
MAXLOCALS = 4
// access flags 0x9
public static values()[Lcom/eathemeat/cabinetflow/TestClass;
GETSTATIC com/eathemeat/cabinetflow/TestClass.$VALUES : [Lcom/eathemeat/cabinetflow/TestClass;
INVOKEVIRTUAL [Lcom/eathemeat/cabinetflow/TestClass;.clone ()Ljava/lang/Object;
CHECKCAST [Lcom/eathemeat/cabinetflow/TestClass;
ARETURN
MAXSTACK = 1
MAXLOCALS = 0
// access flags 0x9
public static valueOf(Ljava/lang/String;)Lcom/eathemeat/cabinetflow/TestClass;
LDC Lcom/eathemeat/cabinetflow/TestClass;.class
ALOAD 0
INVOKESTATIC java/lang/Enum.valueOf (Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;
CHECKCAST com/eathemeat/cabinetflow/TestClass
ARETURN
MAXSTACK = 2
MAXLOCALS = 1
@Lkotlin/Metadata;(mv={1, 6, 0}, k=1, d1={"\u0000\u001c\n\u0002\u0018\u0002\n\u0002\u0010\u0010\n\u0002\u0008\u0002\n\u0002\u0018\u0002\n\u0002\u0008\u0005\n\u0002\u0010\u0002\n\u0002\u0008\u0002\u0008\u0086\u0001\u0018\u00002\u0008\u0012\u0004\u0012\u00020\u00000\u0001B\u0007\u0008\u0002\u00a2\u0006\u0002\u0010\u0002J\u0008\u0010\u0009\u001a\u00020\nH&R\u001a\u0010\u0003\u001a\u00020\u0004X\u0096\u000e\u00a2\u0006\u000e\n\u0000\u001a\u0004\u0008\u0005\u0010\u0006\"\u0004\u0008\u0007\u0010\u0008j\u0002\u0008\u000b\u00a8\u0006\u000c"}, d2={"Lcom/eathemeat/cabinetflow/TestClass;", "", "(Ljava/lang/String;I)V", "value", "Lcom/eathemeat/cabinetflow/TestClassA;", "getValue", "()Lcom/eathemeat/cabinetflow/TestClassA;", "setValue", "(Lcom/eathemeat/cabinetflow/TestClassA;)V", "test", "", "A", "app_debug"})
// access flags 0x18
final static INNERCLASS com/eathemeat/cabinetflow/TestClass$A com/eathemeat/cabinetflow/TestClass A
// compiled from: Wahhhhh.kt
}
// ================com/eathemeat/cabinetflow/TestClass$A.class =================
// class version 52.0 (52)
// access flags 0x30
final class com/eathemeat/cabinetflow/TestClass$A extends com/eathemeat/cabinetflow/TestClass {
// access flags 0x2
private Lcom/eathemeat/cabinetflow/TestClassA; value
@Lorg/jetbrains/annotations/NotNull;() // invisible
// access flags 0x1
public getValue()Lcom/eathemeat/cabinetflow/TestClassA;
@Lorg/jetbrains/annotations/NotNull;() // invisible
L0
LINENUMBER 8 L0
ALOAD 0
GETFIELD com/eathemeat/cabinetflow/TestClass$A.value : Lcom/eathemeat/cabinetflow/TestClassA;
ARETURN
L1
LOCALVARIABLE this Lcom/eathemeat/cabinetflow/TestClass$A; L0 L1 0
MAXSTACK = 1
MAXLOCALS = 1
// access flags 0x1
public setValue(Lcom/eathemeat/cabinetflow/TestClassA;)V
// annotable parameter count: 1 (visible)
// annotable parameter count: 1 (invisible)
@Lorg/jetbrains/annotations/NotNull;() // invisible, parameter 0
L0
ALOAD 1
LDC "<set-?>"
INVOKESTATIC kotlin/jvm/internal/Intrinsics.checkNotNullParameter (Ljava/lang/Object;Ljava/lang/String;)V
L1
LINENUMBER 8 L1
ALOAD 0
ALOAD 1
PUTFIELD com/eathemeat/cabinetflow/TestClass$A.value : Lcom/eathemeat/cabinetflow/TestClassA;
RETURN
L2
LOCALVARIABLE this Lcom/eathemeat/cabinetflow/TestClass$A; L0 L2 0
LOCALVARIABLE <set-?> Lcom/eathemeat/cabinetflow/TestClassA; L0 L2 1
MAXSTACK = 2
MAXLOCALS = 2
// access flags 0x1
public test()V
L0
LINENUMBER 10 L0
NEW java/lang/StringBuilder
DUP
INVOKESPECIAL java/lang/StringBuilder.<init> ()V
LDC "test called "
INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
ALOAD 0
INVOKEVIRTUAL com/eathemeat/cabinetflow/TestClass$A.getValue ()Lcom/eathemeat/cabinetflow/TestClassA;
INVOKEVIRTUAL com/eathemeat/cabinetflow/TestClassA.getName ()Ljava/lang/String;
INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
INVOKEVIRTUAL java/lang/StringBuilder.toString ()Ljava/lang/String;
ASTORE 1
L1
GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
ALOAD 1
INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/Object;)V
L2
L3
LINENUMBER 11 L3
RETURN
L4
LOCALVARIABLE this Lcom/eathemeat/cabinetflow/TestClass$A; L0 L4 0
MAXSTACK = 2
MAXLOCALS = 2
// access flags 0x0
// signature ()V
// declaration: void <init>()
<init>(Ljava/lang/String;I)V
L0
LINENUMBER 7 L0
ALOAD 0
ALOAD 1
ILOAD 2
ACONST_NULL
INVOKESPECIAL com/eathemeat/cabinetflow/TestClass.<init> (Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
L1
LINENUMBER 8 L1
ALOAD 0
NEW com/eathemeat/cabinetflow/TestClassA
DUP
LDC "AA"
INVOKESPECIAL com/eathemeat/cabinetflow/TestClassA.<init> (Ljava/lang/String;)V
PUTFIELD com/eathemeat/cabinetflow/TestClass$A.value : Lcom/eathemeat/cabinetflow/TestClassA;
RETURN
L2
LOCALVARIABLE this Lcom/eathemeat/cabinetflow/TestClass$A; L0 L2 0
LOCALVARIABLE $enum$name Ljava/lang/String; L0 L2 1
LOCALVARIABLE $enum$ordinal I L0 L2 2
MAXSTACK = 4
MAXLOCALS = 3
@Lkotlin/Metadata;(mv={1, 6, 0}, k=1, d1={"\u0000\u0018\n\u0002\u0018\u0002\n\u0002\u0018\u0002\n\u0000\n\u0002\u0018\u0002\n\u0002\u0008\u0005\n\u0002\u0010\u0002\n\u0000\u0008\u00c6\u0001\u0018\u00002\u00020\u0001J\u0008\u0010\u0008\u001a\u00020\u0009H\u0016R\u001a\u0010\u0002\u001a\u00020\u0003X\u0096\u000e\u00a2\u0006\u000e\n\u0000\u001a\u0004\u0008\u0004\u0010\u0005\"\u0004\u0008\u0006\u0010\u0007\u00a8\u0006\n"}, d2={"Lcom/eathemeat/cabinetflow/TestClass$A;", "Lcom/eathemeat/cabinetflow/TestClass;", "value", "Lcom/eathemeat/cabinetflow/TestClassA;", "getValue", "()Lcom/eathemeat/cabinetflow/TestClassA;", "setValue", "(Lcom/eathemeat/cabinetflow/TestClassA;)V", "test", "", "app_debug"})
// access flags 0x18
final static INNERCLASS com/eathemeat/cabinetflow/TestClass$A com/eathemeat/cabinetflow/TestClass A
// compiled from: Wahhhhh.kt
}
// ================com/eathemeat/cabinetflow/WahhhhhKt.class =================
// class version 52.0 (52)
// access flags 0x31
public final class com/eathemeat/cabinetflow/WahhhhhKt {
// access flags 0x19
public final static main([Ljava/lang/String;)V
// annotable parameter count: 1 (visible)
// annotable parameter count: 1 (invisible)
@Lorg/jetbrains/annotations/NotNull;() // invisible, parameter 0
L0
ALOAD 0
LDC "args"
INVOKESTATIC kotlin/jvm/internal/Intrinsics.checkNotNullParameter (Ljava/lang/Object;Ljava/lang/String;)V
L1
LINENUMBER 20 L1
GETSTATIC com/eathemeat/cabinetflow/TestClass.A : Lcom/eathemeat/cabinetflow/TestClass;
INVOKEVIRTUAL com/eathemeat/cabinetflow/TestClass.getValue ()Lcom/eathemeat/cabinetflow/TestClassA;
ASTORE 1
L2
GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
ALOAD 1
INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/Object;)V
L3
L4
LINENUMBER 22 L4
RETURN
L5
LOCALVARIABLE args [Ljava/lang/String; L0 L5 0
MAXSTACK = 2
MAXLOCALS = 2
@Lkotlin/Metadata;(mv={1, 6, 0}, k=2, d1={"\u0000\u0014\n\u0000\n\u0002\u0010\u0002\n\u0000\n\u0002\u0010\u0011\n\u0002\u0010\u000e\n\u0002\u0008\u0002\u001a\u0019\u0010\u0000\u001a\u00020\u00012\u000c\u0010\u0002\u001a\u0008\u0012\u0004\u0012\u00020\u00040\u0003\u00a2\u0006\u0002\u0010\u0005\u00a8\u0006\u0006"}, d2={"main", "", "args", "", "", "([Ljava/lang/String;)V", "app_debug"})
// compiled from: Wahhhhh.kt
}
// ================META-INF/app_debug.kotlin_module =================
&
com.eathemeat.cabinetflow WahhhhhKt"*
其中有几段的代码比较重要:
- 在使用枚举的时候:
LINENUMBER 20 L1
GETSTATIC com/eathemeat/cabinetflow/TestClass.A : Lcom/eathemeat/cabinetflow/TestClass;
INVOKEVIRTUAL com/eathemeat/cabinetflow/TestClass.getValue ()Lcom/eathemeat/cabinetflow/TestClassA;
ASTORE 1
L2
GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
ALOAD 1
INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/Object;)V
L3
L4
可以看到上面的代码中使用了GETSTATIC,其作用是从类中获取静态字段。所以可以认为,枚举是在这个类中的静态字段,在程序启动的时候就有了。
- 枚举的定义(实例化)
LINENUMBER 7 L0
ALOAD 0
ALOAD 1
ILOAD 2
ACONST_NULL
INVOKESPECIAL com/eathemeat/cabinetflow/TestClass.<init> (Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
L1
上面的代码是TestClass.A的实例化的代码。其中有意思的是如果代码写成这样:
enum class TestClassB(val cls:TestClass) {
A(TestClass("AA"))
}
相对应的字节码的代码:
LINENUMBER 20 L0
NEW com/eathemeat/cabinetflow/TestClass
DUP
LDC "AA"
INVOKESPECIAL com/eathemeat/cabinetflow/TestClass.<init> (Ljava/lang/String;)V
INVOKESPECIAL com/eathemeat/cabinetflow/TestClassB.<init> (Ljava/lang/String;ILcom/eathemeat/cabinetflow/TestClass;)V
DUP
PUTSTATIC com/eathemeat/cabinetflow/TestClassB.A : Lcom/eathemeat/cabinetflow/TestClassB;
AASTORE
PUTSTATIC com/eathemeat/cabinetflow/TestClassB.$VALUES : [Lcom/eathemeat/cabinetflow/TestClassB;
RETURN
但是这种写法虽然创建了TestClass的的实力,却没有把这个实例和其他的关联起来,导致这个实例没有使用到,也拿不到这个实例的引用。猜想可能是为了之前的用法,把参数传进去。
如果想要简单的使用一个类的实例来代替枚举中的枚举项按照你现如今的做法貌似做不到。