背景:我是名为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'/>
表示在类linkToStatic
上使用方法java.lang.invoke.MethodHandle
进行编译(使用本机包装器)作为参数
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
个varargs参数(与LogCompilation参数匹配)但声明了java.lang.Object
返回类型。
将LogCompilation签名中的void
返回与java.lang.Object
匹配是否合法,原因如下:
Object.class.isAssignableFrom(Void.class); // returns true
如果有人能够解释无效返回类型背后的机制,我将不胜感激。
谢谢,
克里斯
答案 0 :(得分:1)
linkToStatic
方法是signature polymorphic method。他们的签名因呼叫站点而异。
HotSpot将在内部创建具有呼叫站点所需签名的新Method
个对象(请参阅SystemDictionary::find_method_handle_intrinsic
)。
您为此method
看到的nmethod
属性是此类Method
的字符串表示形式:其签名(包括返回类型)专用于特定的调用站点。
所以一般来说不可以将void
返回类型与java.lang.Object
匹配,你可能需要一个特殊的案例来匹配签名多态方法。