我在CentOS release 5.3 (Final)遇到一種情況:
一個類的所有public static final字段中,按照定義的從上往下順序,到一個字段為止,此字段的上面的所有字段都能訪問,此字段下面(包括子字段)都不能訪問。
具體是這樣的:resin環境下一個jsp訪問一個類的某個字段,在web請求此jsp的時候被告知編譯jsp失敗,原因是:cannot find symbol。并指明了此類的哪一個字段。具體分析后發現此字段的上面所有字段都可以訪問,此字段的下面字段(包括自己)都不能訪問。但是詭異的是,在jsp中使用Class.getField()或者getFields()遍歷是可以拿到此字段的,并且此字段是完整的,可用的。
也就是說JVM實例化了一個類,完成了所有字段的初始化,但是在將所有字段設置為對外可見時失敗了,導致一部分字段對外是不可見的,但是此類卻成功初始化,并對外可用了。這里所說的對外可見不是說字段設置為非public,而是類外根本就看不到,因為如果是非public的話會得到一個訪問修飾符不可見的錯誤,但是現在得到是不存在此符號。這只是我的猜想,并不一定正確。
我的JVM版本如下:
java version "1.6.0_10"
Java(TM) SE Runtime Environment (build 1.6.0_10-b33)
Java HotSpot(TM) 64-Bit Server VM (build 11.0-b15, mixed mode)
其中resin比較老,是3.0.21 pro版本。特別說明的是,這種情況是偶爾才出現,重啟resin就消失了,所有字段可以正常訪問。我一共遇到了兩次,目前仍然不知道是JVM的bug還是resin的bug。
第二個詭異的事情是,聽同事(兩個以上人看過現象)描述他寫了一個單例,如下:
public class Singleton {
private static final Singleton instance = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return instance;
}
}
然后去調用getInstance(),結果居然得到一個null。特別說明的是 沒有ClassNotFoundException異常,沒有java.lang.ExceptionInInitializerError異常,也沒有java.lang.NoClassDefFoundError異常,沒有任何異常,是一個真真正正的null。
當然了,比較詭異的是重啟JVM就沒有此現象了。此現象我沒有重現過,也沒有看到過,只是道途聽說,不好過多評論。
以上兩個問題有誰遇到過么?
難道是RP問題?靈異事件?JVM BUG?
©2009-2014 IMXYLZ
|求賢若渴