这件事发生在我身上,虽然我已经多次这样做而没有引起注意:System.setIn()重新分配静态决赛System.in.
我错过了什么吗?如何重新分配最终字段.
通常,可能不会修改最终的静态字段.但是System.in,System.out并且System.err是最终的静态字段,由于遗留的原因,必须允许通过方法更改System.setIn,System.setOut并且System.setErr.我们将这些字段称为写保护,以区别于普通的最终字段.
编译器需要以不同于其他最终字段的方式处理这些字段.例如,读取普通的最终字段对同步"免疫":锁定或易失性读取中涉及的屏障不必影响从最终字段读取的值.由于可以看到写保护字段的值发生变化,因此同步事件应该对它们产生影响.因此,语义要求将这些字段视为用户代码无法更改的普通字段,除非该用户代码在System类中.
编辑:值得一提的是,您可以"破解"最终字段并通过调用它们的setAccessible(true)(或使用Unsafe方法)来设置其值.这些技术在反序列化期间,通过Hibernate和其他框架等使用,但它们有一个限制:在修改之前看到最终字段值的代码不能保证在修改后看到新值.3系统字段的特殊之处在于它们不受此限制,因为编译器会以特殊方式处理它们.
| 归档时间: |
|
| 查看次数: |
1143 次 |
| 最近记录: |