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

标签 java inner-classes

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/

相关文章:

java - 我如何告诉 nifty GUI 我的字体文件在哪里?

Java 多个子类,但类型不同

java - 我的主 java 类如何知道任何其他 java 类中是否引发了任何异常

java - 此代码背后的逻辑解释 - Java

android - 在 View 中声明内部类是否危险?

java - 解析字符串到日期,时区偏移量完好无损

Java方法接受带分数并返回 double

java - 访问同一个包中的私有(private)内部类

java - 如何在Java中引用列表中的内部类

java - 用作接口(interface)替代的内部类示例