我在CentOS release 5.3 (Final)遇到一種情況:
一個(gè)類的所有public static final字段中,按照定義的從上往下順序,到一個(gè)字段為止,此字段的上面的所有字段都能訪問,此字段下面(包括子字段)都不能訪問。
具體是這樣的:resin環(huán)境下一個(gè)jsp訪問一個(gè)類的某個(gè)字段,在web請(qǐng)求此jsp的時(shí)候被告知編譯jsp失敗,原因是:cannot find symbol。并指明了此類的哪一個(gè)字段。具體分析后發(fā)現(xiàn)此字段的上面所有字段都可以訪問,此字段的下面字段(包括自己)都不能訪問。但是詭異的是,在jsp中使用Class.getField()或者getFields()遍歷是可以拿到此字段的,并且此字段是完整的,可用的。
也就是說JVM實(shí)例化了一個(gè)類,完成了所有字段的初始化,但是在將所有字段設(shè)置為對(duì)外可見時(shí)失敗了,導(dǎo)致一部分字段對(duì)外是不可見的,但是此類卻成功初始化,并對(duì)外可用了。這里所說的對(duì)外可見不是說字段設(shè)置為非public,而是類外根本就看不到,因?yàn)槿绻欠莗ublic的話會(huì)得到一個(gè)訪問修飾符不可見的錯(cuò)誤,但是現(xiàn)在得到是不存在此符號(hào)。這只是我的猜想,并不一定正確。
我的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版本。特別說明的是,這種情況是偶爾才出現(xiàn),重啟resin就消失了,所有字段可以正常訪問。我一共遇到了兩次,目前仍然不知道是JVM的bug還是resin的bug。
第二個(gè)詭異的事情是,聽同事(兩個(gè)以上人看過現(xiàn)象)描述他寫了一個(gè)單例,如下:
public class Singleton {
private static final Singleton instance = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return instance;
}
}
然后去調(diào)用getInstance(),結(jié)果居然得到一個(gè)null。特別說明的是 沒有ClassNotFoundException異常,沒有java.lang.ExceptionInInitializerError異常,也沒有java.lang.NoClassDefFoundError異常,沒有任何異常,是一個(gè)真真正正的null。
當(dāng)然了,比較詭異的是重啟JVM就沒有此現(xiàn)象了。此現(xiàn)象我沒有重現(xiàn)過,也沒有看到過,只是道途聽說,不好過多評(píng)論。
以上兩個(gè)問題有誰遇到過么?
難道是RP問題?靈異事件?JVM BUG?
©2009-2014 IMXYLZ
|求賢若渴