gpt4 book ai didi

java - 为什么编译非静态内部类会在父类上创建隐藏的、包可见的方法

转载 作者:行者123 更新时间:2023-11-30 01:57:38 25 4
gpt4 key购买 nike

IDEA 说

Reports non-static inner classes. Compilation of such classes causes the creation of hidden, package-visible methods on the parent class, which may compromise security.

所以我想知道这是什么意思。

演示代码

public class TaiquShortV2 implements Serializable {
private static final long serialVersionUID = 1L;

class TaiquData implements Serializable {//IDEA report TqiquData Class
private static final long serialVersionUID = 1L;

}
}

最佳答案

我们必须区分源代码和 JVM 级别。

  • 在源代码级别,内部类 Inner 可以访问例如封闭类的私有(private)字段Enclosure

  • 在 JVM 级别,没有内部类的概念:内部类只是一个具有特殊名称的独立类(通常包含 $ 符号,例如 Enwriting$Inner ),与 Enclosure 类位于同一包中。就像任何其他类一样,此 Enleading$Inner 类无法访问 Enleading 的私有(private)字段。为了允许访问私有(private)字段(根据源代码级别的要求),编译器玩了一个技巧:它 secret 地将 getter 和 setter 添加到字段中,使用合成名称(不是经典的 getField()setField() 名称),并让内部类使用这些访问方法而不是直接字段访问。由于这两个类位于同一个包中,因此访问方法至少需要允许包可见性,这就是编译器创建它们的方式。

因此,这些方法使得同一包中声明的任何其他类都可以访问 Enclosure 类的私有(private)字段,从而破坏了私有(private)字段的正常封装。

由您决定该风险是否重要,因为在 Java 内部还有其他可能破坏访问规则。因此,就我个人而言,从架构的角度来看,我总是很乐意在适当的情况下创建内部类。

关于java - 为什么编译非静态内部类会在父类上创建隐藏的、包可见的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53847742/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com