我最近听说在包含敏感信息的类中使用 Java 内部类会导致private类的数据更改为protected字节码级别(意味着包的任何其他类都可以访问它)。
由于我在字节码阅读方面没有任何专业知识,我想知道这是否属实,并对此问题进行一些解释。
我最近听说在包含敏感信息的类中使用 Java 内部类会导致private类的数据更改为protected字节码级别(意味着包的任何其他类都可以访问它)。
由于我在字节码阅读方面没有任何专业知识,我想知道这是否属实,并对此问题进行一些解释。
问题是在字节码级别没有内部类的概念。每个内部类都被编译为一个单独的类,与同一包中的任何其他类相比,没有任何特殊权限。
所以为了支持内部类的功能,编译器必须在幕后添加getter方法。每次从内部类访问外部类中的字段时,编译器都需要在外部类中生成一个getter。但是,这些 getter 不能是私有的,因为这样就没有什么可以调用它们了!因此,getter 总是至少受到保护,这意味着同一包中的任何类都可以访问它。
更新:Java 11 添加了一个新的字节码特性来解决这个问题,所以这不适用于 Java 的最新版本。