System.setIn()重新分配最终的System.in

dim*_*sli 3 java

可能重复:
java:"final"System.out,System.in和System.err?

这件事发生在我身上,虽然我已经多次这样做而没有引起注意:System.setIn()重新分配静态决赛System.in.

我错过了什么吗?如何重新分配最终字段.

dan*_*uch 7

通常,可能不会修改最终的静态字段.但是System.in,System.out并且System.err最终的静态字段,由于遗留的原因,必须允许通过方法更改System.setIn,System.setOut并且System.setErr.我们将这些字段称为写保护,以区别于普通的最终字段.

编译器需要以不同于其他最终字段的方式处理这些字段.例如,读取普通的最终字段对同步"免疫":锁定或易失性读取中涉及的屏障不必影响从最终字段读取的值.由于可以看到写保护字段的值发生变化,因此同步事件应该对它们产生影响.因此,语义要求将这些字段视为用户代码无法更改的普通字段,除非该用户代码在System类中.

编辑:值得一提的是,您可以"破解"最终字段并通过调用它们的setAccessible(true)(或使用Unsafe方法)来设置其值.这些技术在反序列化期间,通过Hibernate和其他框架等使用,但它们有一个限制:在修改之前看到最终字段值的代码不能保证在修改后看到新值.3系统字段的特殊之处在于它们不受此限制,因为编译器会以特殊方式处理它们.

  • 如果您要复制java语言规范的整个部分,请提供参考,http://java.sun.com/docs/books/jls/third_edition/html/memory.html#17.5.4 (2认同)