【发布时间】:2019-08-02 10:54:59
【问题描述】:
在 OOP 中,我们可以将 private、protected 和 public 分配给变量和方法。我知道这有很多优点,但安全性是其中之一吗?这样未经授权的人就不能访问。
【问题讨论】:
-
没有。 None.
-
面向对象编程的设计原则与主要基于基于角色的访问控制 (RBAC) 的安全原则具有不同的目标
在 OOP 中,我们可以将 private、protected 和 public 分配给变量和方法。我知道这有很多优点,但安全性是其中之一吗?这样未经授权的人就不能访问。
【问题讨论】:
简短的回答是“不是真的”。数据仍然在内存中,如果你用反射挖掘你可以得到字段的内容。将字段和方法标记为私有是与其他程序员交流的一种方式:“嘿,这是类的内部工作,容易改变,请不要碰它。”
您可以通过以下方式获取私有字段的值:
// suppose we have a class
Person person = new Person("John");
// Field is from java.lang.reflect.Field
Field nameField = Person.class.getDeclaredField("name");
// tell Java to ignore the private modifier
nameField.setAccessible(true);
// now you can "steal" the private field
System.out.println(nameField.get(person));
除非绝对必要,否则请不要使用这是您的代码,如果您曾经使用反射,请格外小心。
此外,即使该字段无法通过语言设计访问,如果我们在讨论安全性,例如在扫描内存的外部程序中,将字段标记为私有并不会对其隐藏数据。毕竟.. 数据必须在某个地方,对吧?
【讨论】:
这就是oops中的封装原理,也就是信息隐藏。您可以使用访问修饰符来定义类、方法和属性的可见性。
您通过使您的类属性无法从外部访问并通过为其他类可读或可更新的属性提供 getter 和/或 setter 方法来实现此信息隐藏机制。
【讨论】: