背景:我是名为 JITWatch 的 HotSpot LogCompilation 可视化工具的作者。我正在重构解析引擎。我有一个关于将 LogCompilation 方法签名与 Class.getDeclaredMethod()
签名匹配的问题,特别是关于匹配 void 返回类型的问题。
鉴于 HotSpot LogCompilation 输出片段:
<nmethod compile_id='48' compile_kind='c2n' entry='0x00007f01fc3f41c0'
size='328' address='0x00007f01fc3f4090' relocation_offset='296'
consts_offset='328' insts_offset='304'
method='java/lang/invoke/MethodHandle linkToStatic
(Ljava/lang/Object;ILjava/lang/invoke/MemberName;)V'
bytes='0' count='0' iicount='0' stamp='0.840'/>
这表示类 java.lang.invoke.MethodHandle
上方法 linkToStatic
的编译(使用 native 包装器),该方法以参数为参数
java.lang.Object, int, java.lang.invoke.MemberName
并返回 void
它可能在 java.lang.invoke.MethodHandle
上匹配的唯一方法具有签名:
static native java.lang.Object linkToStatic(java.lang.Object...) throws java.lang.Throwable;
其中具有 java.lang.Object
可变参数参数(与 LogCompilation 参数匹配),但声明了 java.lang.Object
返回类型。
将 LogCompilation 签名返回的 void
与 java.lang.Object
匹配是否合法,原因是:
Object.class.isAssignableFrom(Void.class); // returns true
如果有人能解释 void 返回类型背后的机制,我将不胜感激。
谢谢
克里斯
最佳答案
linkToStatic
方法是 signature polymorphic method 。他们的签名因调用站点而异。
HotSpot 将在内部创建具有调用站点所需签名的新 Method
对象(请参阅 SystemDictionary::find_method_handle_intrinsic
)。
您看到的此 nmethod
的 method
属性是此类 Method
的字符串表示形式:其签名(包括返回类型)专门针对特定调用站点。
因此,一般来说,将 void
返回类型与 java.lang.Object
匹配不是可以的,并且您可能需要特殊情况来匹配签名多态方法。
关于java - HotSpot LogCompilation 输出 : Should V (Void) match a java. lang.Object 返回类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26596358/