私有成员在Java中真的更“安全”吗?

2022-09-03 14:51:12

在学习Java时,我有时被教导使用访问修饰符,以免将“敏感信息”暴露给其他类,就好像这可能会打开一个合法的安全漏洞一样。但是,我从未遇到过这样的情况:限制成员可见性不仅仅是以面向对象的方式对程序进行建模的便利。private

Java类中的私有字段和函数实际上比其他方法更“安全”吗?


编辑 - 最佳答案的汇编。

为什么不意味着“安全”:private

  • 反编译器允许静态查看字节码
  • 反射库允许运行时访问私有成员

什么好处:private

  • 由于强制方法级访问而导致的代码的可维护性
  • 通过隐藏实现细节实现代码的模块化

答案 1

我从来没有听说过它 - 在任何严肃的意义上 - 作为一个安全问题。我的意思是,反编译器是有效的。您可以使用它们来弄清楚字节码内部发生了什么。

拥有成员是一个可维护性问题。如果我只授予您对我的内部结构的方法级访问权限,那么我唯一的责任就是确保我的 API 方法继续工作。我不会在内部使用a与a,只要我的方法继续返回s(例如)。privateDoubleBigDecimalDouble


答案 2

不,从这个意义上说,它们并不是更“安全”,尽管一些关于Java的(非常差的)书籍试图以这种方式解释。如果攻击者能够在您的进程中运行任意Java代码,那么所有的“安全性”都已经消失了。正如已经提到的另一个答案,反射可以绕过访问修饰符。privateprivate