【问题标题】:why compile non-static inner class will creation of hidden, package-visible methods on the parent class [duplicate]为什么编译非静态内部类会在父类上创建隐藏的、包可见的方法[重复]
【发布时间】:2018-12-19 09:01:56
【问题描述】:

想法说

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

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

演示代码

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;

    }
}

【问题讨论】:

标签: java inner-classes


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

    内部类(非静态)与类的任何其他属性或方法一样,它们可以访问其他成员。但是静态类没有这种访问权限。 因此,IDEA 可能会警告您,如果您不需要访问嵌套类中的其他成员,那么最好将其设为静态。

    请提供您的代码以便更好地分析它。

    你也可以看看this thread

    【讨论】:

    • 我添加演示代码
    猜你喜欢
    • 1970-01-01
    • 2015-10-07
    • 2011-09-01
    • 2018-09-20
    • 2015-04-28
    • 1970-01-01
    • 2011-09-16
    • 2016-07-04
    • 2015-11-13
    相关资源
    最近更新 更多