加载System类时,<clinit>
方法使用nullPrintStream()
方法将in
、out
和err
PrintStream
变量实例化为null
:
private static PrintStream nullPrintStream() throws NullPointerException {
if (currentTimeMillis() > 0) {
return null;
}
throw new NullPointerException();
}
我理解为什么会出现这种情况,以及为什么在加载过程中不能实例化变量,但我对该方法的内容感到困惑。
为什么要比较currentTimeMillis()
和0
?在什么情况下,该比较会返回false
?
nullPrintStream()方法的Javadoc提供了一条线索:
但是,不能允许编译器内联访问它们,因为它们后来被设置为更合理的值通过initializeSystemClass()。
我想,这是一个编码破解,目的是防止编译器内联一个简单的"return null"实现。
currentTimeMillis()永远不会小于0。但是编译器不够聪明,不知道这一点,因此保留了条件语句。