我最近听说,在包含敏感信息的类中使用Java内部类会导致该类的private数据在字节码级别更改为protected(这意味着程序包的任何其他类都可以访问它)。
由于我没有字节码读取方面的专业知识,所以我想知道它是否正确,并对此问题进行一些解释。

评论

仅供参考,Java编译器的源代码@ hg.openjdk.java.net/jdk8/jdk8/langtools/file/1ff9d5118aae/src / ...

#1 楼

问题是在字节码级别没有内部类的概念。与同一包中的任何其他类相比,每个内部类均被编译为一个没有特殊特权的单独类。

因此,为了支持内部类的功能,编译器必须在其后添加getter方法现场。每次从内部类访问外部类中的字段时,编译器都需要在外部类中生成getter。但是,这些吸气剂不能是私有的,因为那样就没人称呼它们!因此,getter至少始终受到保护,这意味着同一包中的任何类都可以访问它。

更新:Java 11添加了新的字节码功能来解决此问题,因此不适用于最新版本。 Java版本。