JVM类型签名的方法类型是什么

What's the method-type of JVM type signature

根据JVM Specification, JVM 有 11 种类型签名,其中之一是 'method type',我从来没见过。它是什么 ?

正如 Holger 指出的那样,您 link 的文档是针对 Java 本机接口 (JNI) 的,而不是 JVM 规范。

JNI 使用方法签名来确定(更准确地说是解析)要使用的方法。正如文档所指出的,这与 JVM 使用的方法相同。

方法签名允许唯一标识方法。 Java 语言有方法重载的概念,这意味着你可以在一个 class 中有多个同名的方法。编译器如何区分它们是使用方法签名,它由方法的名称、泛型类型参数(如果有)以及参数的数量和类型组成。重要的是要了解只有这些值用于签名。未考虑方法定义的其他几个方面:

  • Return类型
  • 抛出异常
  • 这是静态方法还是实例方法
  • 访问修饰符(public、包、受保护、私有)

这意味着即使 return 类型不同或抛出不同的异常,您也不能拥有两个具有相同参数数量和类型的同名方法。 (有关详细信息,请参阅 Java 语言规范的第 8.4.2 节)。

但是,在 JVM 内部,方法签名确实包含 return 类型(有关更多详细信息,请参阅 Java 虚拟机规范的第 4.3.3 节)。

在 JNI 中,方法签名是使用您 link 访问的页面上的语法定义的。

让我们使用该页面上的示例方法:

long f (int n, String s, int[] arr) { ... }

它的 JVM 表示形式是

(ILjava/lang/String;[I)J 

要在 JNI 中使用它,我们可能需要这样的东西:

jclass cls = (*env)->GetObjectClass(env, obj);
jmethodID mid = (*env)->GetMethodID(env, cls, "f", "(ILjava/lang/String;[I)J");

如您所见,我们将方法类型签名作为参数传递给 GetMethodID 方法,以便 JNI(和 JVM)可以将哪个方法解析为 return 的标识。