我在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
|求贤若渴