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中,还有其他可能破坏访问规则。因此,就我个人而言,从架构的角度来看,我总是乐于在适当的地方创建内部类。您能分享导致该警告的代码吗?这可能会有所帮助:我添加了演示代码