您好,
1) 按照你的解决方法思路就是在对象实例化之前JVM已经调用了clinit()方法了,也就是类已经初始化了,所以类变量也已经初始化了我想问你这是怎么触发类初始化的。
该问题在文中已有阐述:
* "Java 虚拟机规范为类的初始化时机做了严格定义:"initialize on first active use"--" 在首次主动使用时初始化"。"
*
首次主动使用的情形:
o 创建某个类的新实例时--new、反射、克隆或反序列化;
o 调用某个类的静态方法时;
o 使用某个类或接口的静态字段或对该字段赋值时(final字段除外);
o 调用Java的某些反射方法时
o 初始化某个类的子类时
o 在虚拟机启动时某个含有main()方法的那个启动类。
2) 你在文章中提到init()方法包括了"所有具有指定初始化值的实例变量初始化语句",既然如此为什么没有执行CODE_MAP_CACHE = new HashMap()呢?
"CODE_MAP_CACHE = new HashMap()"语句是执行了的,并非您理解的"没有执行",而是在对象实例化时调用initEnum()方法对CODE_MAP_CACHE初始化并赋值后,又重新在static{ ... }区块内进行了初始化。这是因为在类还未来得及初始化完毕时,在类自身有一条实例化自身的语句"private static final CachingEnumResolver SINGLE_ENUM_RESOLVER = new CachingEnumResolver();"所导致的。
回复 更多评论