如何在 Java 中的包私有声明中破坏封装

Posted

技术标签:

【中文标题】如何在 Java 中的包私有声明中破坏封装【英文标题】:How can be encapsulation broken in package-private declarations in Java 【发布时间】:2021-09-28 00:11:52 【问题描述】:

“封装很容易被破坏,因为外部代码可以在您的代码使用的相同包中定义类,从而可以访问您的包私有声明。”

我无法理解我们如何才能实现声明中所写的内容。封装怎么破?

【问题讨论】:

【参考方案1】:

您可以通过一个小示例了解这意味着什么。

这里我们有一个带有一些 package-private 可见性变量的类,当不使用可见性关键字时应用可见性。

package insider;

public class PrivateClass 
  static int var1 = 10;
  static String var2 = "Secret";

这里我在另一个包中有一个类。这不会为变量抛出任何可见性错误。

package outsider;

import insider.PrivateClass;

public class OutsiderClass 
  public static void outsider() 
    System.out.println(PrivateClass.var2 + " " + PrivateClass.var1);
  

这里我有一个与我们的package-private 变量类在同一个包中的类。这个在访问变量时不会抛出错误。

package insider;

public class InfiltratorClass 
  public static void infiltrator() 
    System.out.println(PrivateClass.var2 + " " + PrivateClass.var1);
  

文件结构概述:

insider
  PrivateClass
  InfiltratorClass
outsider
  OutsiderClass

【讨论】:

所以外部类可以使用 InfiltratorClass 渗透方法来访问包私有可见性变量。我做对了吗?在这里,我们可以创建一个 InfiltratorClass,但是当我们使用外部库时。那么我们就不能创建 InfiltratorClass 所以在这种情况下不能破坏封装? @SarthakMittal 是的,您可以让InfiltratorClass 直接使用setVar1() 方法编辑值。使用外部库isn't impervious to tampering,但正确使用private 关键字可以防止InfiltratorClass 在一般使用情况下访问变量。

以上是关于如何在 Java 中的包私有声明中破坏封装的主要内容,如果未能解决你的问题,请参考以下文章

java反射机制可以调用到私有方法,是否就破坏了JAVA的卦装性呢。

如何使用 setup.py 安装托管在私有 PyPI 中的包?

Java中的封装

Java面向对象:封装特性的学习

覆盖Java中的私有方法

如何将 Scala 中的包设为私有?