【发布时间】:2011-05-10 14:16:48
【问题描述】:
System.out 被声明为public static final PrintStream out。
但您可以致电System.setOut() 重新分配。
嗯?如果是final,这怎么可能?
(同一点适用于System.in 和System.err)
更重要的是,如果您可以更改公共静态最终字段,那么就final 为您提供的保证(如果有)而言,这意味着什么? (我从来没有意识到也不期望 System.in/out/err 表现为final 变量)
【问题讨论】:
-
Final 字段并没有享受 JVM 本身带来的很多好处,尽管它们经过验证者的严格检查。也有一些方法可以修改最终字段,但不能通过标准的 java 代码(因为它是验证程序的主题)。它是通过 Unsafe 完成的,并通过 Field.set 暴露在 java 中(需要可访问的 true),它编译为提到的 Unsafe 内容。 JNI 也可以做到这一点,因此 JVM 并不热衷于尝试优化... {也许我应该将评论构建为答案,但是 meh}