Java'final'关键字是否真正提高了安全性?

And*_*res 19 java security final

虽然在Java中使用'final'关键字的原因很多,但我一遍又一遍地听到的一个原因是它使您的代码更安全.虽然这在这个微不足道的案例中似乎有意义:

public class Password
{
    public final String passwordHash;
    ...
}
Run Code Online (Sandbox Code Playgroud)

使用final关键字,您可以预期没有恶意代码可以更改变量passwordHash.但是,使用反射可以更改passwordHash字段的最终修饰符.

"最终"提供任何真正的安全性,还是只是安慰剂?

编辑: 有一些非常有趣的讨论,我希望我能接受不止一个答案.谢谢各位的意见.

Jav*_*ier 37

从"抵御攻击"的意义上说,这不是"安全"; 它更像是"更难搞乱".

我更喜欢"安全"这个词; 我觉得它更像是防止意外,而不是恶意.


And*_*are 10

Java的final关键字不用于此类安全性.它不能代替通常需要加密解决方案的东西.

在这类讨论中,"安全"通常意味着安全对象模型的概念 - 也就是说,对象模型不能被消费者操纵,以达到该类原作者无意的目的.

  • 排序,一个构造良好的类将封装其状态,并且只有`final`方法的类将不允许使用者覆盖类的行为并更改状态的封装方式.类可以暴露其状态(例如通过公共字段),并且没有`final`关键字能够保护该状态的完整性. (3认同)

Uri*_*Uri 8

我不确定我会依赖语言结构来增强系统的安全性.

我不认为制作一个字段最终会增加安全性来抵御恶意攻击(更有可能防止错误,当然还有线程问题).安全性的唯一"真实形式"是,如果您有一个最终的常量字段,它可能会在编译时被内联,因此在运行时更改其值将没有任何影响.

我在继承的背景下听说过最终和安全性.通过使一个类最终,你可以阻止某人继承它并触摸或覆盖其受保护的成员,但我再次使用它来避免错误而不是防止威胁.