前言
本文从枚举的字节码方面看枚举,并学习下 swtich的实现 和 swtich(String) 的实现。
一、一个简单的枚举
public class EnumTest {
enum EnumDay {
MONDAY,
TUESDAY,
WENSDAY
}
public static void testEnum(EnumDay day){
switch (day){
case MONDAY:
break;
case TUESDAY:
break;
case WENSDAY:
break;
default:
break;
}
}
}
我们定义了一个枚举类EnumDay, 定义了三个值 MONDAY,TUESDAY,WENSDAY
接下来我们通过 javac EnumTest 看下编译后生成了 EnumTest.class EnumTest1.classEnumTest1.class EnumTest1.classEnumTestEnumDay.class 三个class 文件。
我们看下 EnumTest 的字节码文件(javap -c EnumTest)
{
public javaplan.EnumTest(); // 无参的构造方法
descriptor: ()V // 构造方法描述符,入参没有,返回值是 V 代表void
flags: ACC_PUBLIC // 方法访问标记 public
//操作数栈深度 1 局部变量表大小 1 参数个数 1 这里指this
Code:
stack=1, locals=1, args_size=1
0: aload_0 //将局部变量表第0 个位置加载到操作数栈顶,即 this
1: invokespecial #1 // Method java/lang/Object.“”😦)V //用this 执行init 方法
4: return
LineNumberTable:
line 3: 0
//TestEnum 方法实现
public static void testEnum(javaplan.EnumTest E n u m D a y ) ; d e s c r i p t o r : ( L j a v a p l a n / E n u m T