JDK17内部类机制疑问:javap与反射结果不一致原因咨询
JDK17局部内部类构造器:javap与反射输出不一致的原因
这是JDK 16及以后版本引入的内部类合成构造器参数隐藏优化导致的差异,具体细节如下:
仅引用外部类成员的场景:
当局部内部类只引用外部类的成员(比如beep)时,编译器会生成一个带有外部类实例引用参数的构造器,这个参数属于传统内部类的必要实现,javap-private命令会正常显示它,因为它不属于JDK16+新增的隐藏优化范畴。同时引用方法参数的场景:
当局部内部类同时引用外部方法的局部参数(比如interval)时,JDK16+的编译器会对构造器参数做优化:将外部类实例引用和被捕获的局部变量打包为合成(synthetic)参数,这些参数会被javap默认过滤,即使加上-private也不会显示。但反射API会读取class文件中构造器的完整元数据,包括所有合成参数,所以能看到TalkingClock和int类型的两个参数。查看完整构造器信息的方法:
如果想通过javap看到完整的构造器参数,需要使用javap -v -private命令查看字节码的详细信息,其中的MethodParameters属性会列出所有参数,包括被隐藏的合成参数。
内容的提问来源于stack exchange,提问作者JavaStudent001
相关产品推荐
相关产品推荐

