为什么枚举的$VALUES的field有时候是name 是 ENUM$VALUES

  在弄热更新class 文件时,java 里面枚举类是有个filed叫做$VALUES 的,java 文档里面也说
  The $VALUES field is related to the implementation of the values() method

但是有时候有的枚举里面这个fileld的名字是ENUM$VALUES,但是反编译出来还是只有$VALUES,
#1 = Fieldref #4.#86 // com/aobi/app/dto/gamehall/magiccloth/enums/EMCMagicType.$VALUES:[Lcom/aobi/app/dto/gamehall/magiccloth/enums/EMCMagicType;
热更新的时候就会失败,说add or remove field,这是什么规则呢?

枚举类在编译的时候会自动生成很多东西,其中就有一个名为ENUM$VALUES的常量,是个private static final的数组。在枚举类初始化的时候,会实例化所有的枚举对象然后按顺序放在这个数组中。

就是这个数组常量的名字导致了你的疑问。

其实,这个常量的名字没有啥特殊的地方,完全取决于编译器。如果你觉得好玩,专门在代码中增加一个名字叫ENUM$VALUES的枚举值,编译器为了不冲突,就会自己生成一个名叫ENUM$VALUES_0的数组。你再加一个ENUM$VALUES_0,编译器就会改成ENUM$VALUES_1。。。真的,只是编译器的行为,编译器随便取的名字而已。

这样调戏编译器虽然好玩,但是真的有很多地方直接把ENUM$VALUES当做绝对值来判断了的,就在我用反编译器jd-gui反编译测试的时候,就出问题了,没有识别出来,显然认为这个隐式生成的常量名是固定的了。

关于你说的问题,可能的情况是原来的代码和新的代码不适用同一种编译器编译的,导致这个常量出现了两种不同的名字,可以理解。