使用反射以及http://docs.oracle.com提供的安装程序中安装的JDK中提供的src.zip ,我找到了以下字段java.lang.System,
in, out&err被宣布为final,但他们有各自的(公共)setter方法,这些方法反过来调用他们各自的本地部分.
例如,我可以成功地将控制台输出重定向到文件.
我们可以在Java代码中初始化后准确设置最终变量.
我的问题是:这个最终规则不适用于本机代码吗?
Ste*_*n C 15
我的问题是:这个最终规则不适用于本机代码吗?
本机代码可以破坏规则final.它还可以打破访问规则和基本类型安全,以及其他各种事情.
关于final字段实际上不是不可变的这一点实际上是在JLS中识别的:参见JLS 17.5.3.其中的要点是,如果您确实更改了final(例如通过反射),则某些保证不再成立.并且更改final表示编译时常量的a的值可能根本没有任何影响.
但正如@ignis指出的那样,System.in/out/err在JLS中特别提到"写保护"(JLS 17.5.4)而不是正常的final语义.基本上,这意味着final保证做,如果变量进行变更持有均匀.
为什么变量最终会有一个setter?
在这种特殊情况下,1)防止System.in/out/err被意外分配破坏,2)以便可以通过控制来控制变化SecurityManager.
| 归档时间: |
|
| 查看次数: |
3826 次 |
| 最近记录: |