为何反射判定DirectMethodHandle$Holder不是DirectMethodHandle的成员类?
DirectMethodHandle$Holder反射断言失败的原因分析 核心现象
DirectMethodHandle$Holder是Class.forName("java.lang.invoke.DirectMethodHandle").getDeclaredClasses()返回的类之一,而该方法的文档明确说明其返回的是成员类。但在JDK 19中,以下断言会失败:
assert Class.forName("java.lang.invoke.DirectMethodHandle$Holder").isMemberClass();
矛盾验证
使用注解处理相关API(javax.annotation.processing、javax.lang.model.*)时,对应的嵌套类型判断断言却能正常通过:
assert NestingKind.MEMBER == ((TypeElement)processingEnvironment.getElementUtils().getTypeElement("java.lang.invoke.DirectMethodHandle.Holder")).getNestingKind();
这说明编译器底层的类型嵌套识别逻辑,与反射API的输出结果不一致。
结论
这是JDK的一个特殊BUG,违反了JLS 8.5节中对成员类的定义规则(成员类是作为另一个类的成员声明的类)。该问题已提交至JDK缺陷库,编号为JDK-8300181。
内容的提问来源于stack exchange,提问作者Laird Nelson
相关产品推荐
相关产品推荐

