Java 11+移除Synthetic Methods后,内部类如何访问私有成员?
Java 11+ 内部类访问外部类私有成员的实现方式
在Java 11之前,编译器确实会生成**合成方法(synthetic methods)作为内部类访问外部类私有成员的桥梁,但Java 11引入了嵌套访问控制(Nested Access Control)**机制,从字节码和JVM层面直接支持同一嵌套结构内类的私有成员互访,彻底替代了合成方法的需求。
具体实现细节如下:
- 嵌套组标记:编译器会在字节码中新增两个关键属性:
NestHost:内部类的字节码会标记其外部类为“嵌套宿主”,明确归属关系;NestMembers:外部类的字节码会列出所有属于同一嵌套组的类(包括成员内部类、局部内部类、匿名内部类等)。
JVM通过这两个属性识别哪些类属于同一个嵌套结构,默认允许它们之间的私有成员访问。
- 直接指令访问:内部类访问外部类私有字段时,不再调用合成的getter/setter,而是直接使用
getfield/putfield字节码指令;调用私有方法则使用invokespecial指令。JVM在执行时会检查两个类是否属于同一嵌套组,若符合条件则跳过常规的私有访问权限校验,允许直接访问。
举个简单场景:外部类Outer有私有字段private int value,成员内部类Inner直接读取value。Java 11编译后,Inner的字节码会带有NestHost指向Outer,Outer的字节码会在NestMembers中包含Inner;运行时JVM验证两者属于同一嵌套组,直接允许Inner通过getfield读取value,无需生成任何合成方法。
内容的提问来源于stack exchange,提问作者the_kaba
相关产品推荐
相关产品推荐

