为什么编译非静态内部 class 会在父 class 上创建隐藏的、包可见的方法
why compile non-static inner class will creation of hidden, package-visible methods on the parent class
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;
}
}
内部 classes(非静态)与 class 的任何其他属性或方法一样,它们可以访问其他成员。但是静态 classes 没有这种访问权限。
因此,IDEA 可能会警告您,如果您不需要访问嵌套 class 中的其他成员,那么最好将其设为静态。
请提供您的代码以便更好地分析它。
你也可以看看this thread
我们要区分源代码和JVM级别。
在源代码级别,内部class Inner
可以访问例如封闭 class Enclosing
.
的私有字段
在 JVM 级别,没有内部 class 的概念:内部 class 只是一个具有特殊名称的独立 class(通常包含 $ 符号,例如 Enclosing$Inner
),位于与 Enclosing
class 相同的包中。就像任何其他 class 一样,此 Enclosing$Inner
class 无法访问 Enclosing
的私有字段。为了允许访问私有字段(根据源代码级别的要求),编译器玩了一个把戏:它秘密地将 getter 和 setter 添加到字段中,使用合成名称(不是 classical getField()
和 setField()
名称),并让内部 class 使用这些访问方法而不是直接字段访问。由于两个 classes 在同一个包中,访问方法至少需要允许包可见性,这就是编译器创建它们的方式。
因此,这些方法使得在同一包中声明的任何其他 class 都可以访问 Enclosing
class 的私有字段,打破了私有字段的正常封装.
由您决定该风险是否重要,因为在 Java 内部还有其他可能破坏访问规则的可能性。因此,就个人而言,从架构的角度来看,我总是很高兴地在适当的地方创建内部 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;
}
}
内部 classes(非静态)与 class 的任何其他属性或方法一样,它们可以访问其他成员。但是静态 classes 没有这种访问权限。 因此,IDEA 可能会警告您,如果您不需要访问嵌套 class 中的其他成员,那么最好将其设为静态。
请提供您的代码以便更好地分析它。
你也可以看看this thread
我们要区分源代码和JVM级别。
在源代码级别,内部class
Inner
可以访问例如封闭 classEnclosing
. 的私有字段
在 JVM 级别,没有内部 class 的概念:内部 class 只是一个具有特殊名称的独立 class(通常包含 $ 符号,例如
Enclosing$Inner
),位于与Enclosing
class 相同的包中。就像任何其他 class 一样,此Enclosing$Inner
class 无法访问Enclosing
的私有字段。为了允许访问私有字段(根据源代码级别的要求),编译器玩了一个把戏:它秘密地将 getter 和 setter 添加到字段中,使用合成名称(不是 classicalgetField()
和setField()
名称),并让内部 class 使用这些访问方法而不是直接字段访问。由于两个 classes 在同一个包中,访问方法至少需要允许包可见性,这就是编译器创建它们的方式。
因此,这些方法使得在同一包中声明的任何其他 class 都可以访问 Enclosing
class 的私有字段,打破了私有字段的正常封装.
由您决定该风险是否重要,因为在 Java 内部还有其他可能破坏访问规则的可能性。因此,就个人而言,从架构的角度来看,我总是很高兴地在适当的地方创建内部 classes。