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

Java 为什么编译非静态内部类会在父类上创建隐藏的、包可见的方法,java,inner-classes,Java,Inner Classes,意念说 报告非静态内部类。编译此类类会导致在父类上创建隐藏的、包可见的方法,这可能会危及安全性 所以我想知道这是什么意思 演示代码 public class TaiquShortV2 implements Serializable { private static final long serialVersionUID = 1L; class TaiquData implements Serializable {//IDEA report TqiquData Class

意念说

报告非静态内部类。编译此类类会导致在父类上创建隐藏的、包可见的方法,这可能会危及安全性

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

演示代码

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级别

  • 在源代码级别,内部类
    内部
    可以访问封闭类
    封闭
    的私有字段等

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

因此,这些方法使得在同一个包中声明的任何其他类都可以访问包含类的
的私有字段,从而打破了私有字段的正常封装


风险是否重要取决于您自己,因为在Java中,还有其他可能破坏访问规则。因此,就我个人而言,从架构的角度来看,我总是乐于在适当的地方创建内部类。

您能分享导致该警告的代码吗?这可能会有所帮助:我添加了演示代码