HotSpot LogCompilation输出:V(Void)是否应该匹配java.lang.Object返回类型?

时间:2014-10-27 20:34:38

标签: java jvm-hotspot

背景:我是名为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

如果有人能够解释无效返回类型背后的机制,我将不胜感激。

谢谢,

克里斯

1 个答案:

答案 0 :(得分:1)

linkToStatic方法是signature polymorphic method。他们的签名因呼叫站点而异。

HotSpot将在内部创建具有呼叫站点所需签名的新Method个对象(请参阅SystemDictionary::find_method_handle_intrinsic)。

您为此method看到的nmethod属性是此类Method的字符串表示形式:其签名(包括返回类型)专用于特定的调用站点。

所以一般来说可以将void返回类型与java.lang.Object匹配,你可能需要一个特殊的案例来匹配签名多态方法。