ououquan 2017-04-26 03:11 采纳率: 0%
浏览 1365

为什么枚举的$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,这是什么规则呢?

  • 写回答

1条回答 默认 最新

  • yizishou 2017-04-26 06:17
    关注

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

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

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

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

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

    评论

报告相同问题?

悬赏问题

  • ¥15 ROS Turtlebot3 多机协同自主探索环境时遇到的多机任务分配问题,explore节点
  • ¥15 Matlab怎么求解含参的二重积分?
  • ¥15 苹果手机突然连不上wifi了?
  • ¥15 cgictest.cgi文件无法访问
  • ¥20 删除和修改功能无法调用
  • ¥15 kafka topic 所有分副本数修改
  • ¥15 小程序中fit格式等运动数据文件怎样实现可视化?(包含心率信息))
  • ¥15 如何利用mmdetection3d中的get_flops.py文件计算fcos3d方法的flops?
  • ¥40 串口调试助手打开串口后,keil5的代码就停止了
  • ¥15 电脑最近经常蓝屏,求大家看看哪的问题