- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
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/
我是一名优秀的程序员,十分优秀!