您好,
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();"所導致的。
回復 更多評論