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

时间:2018-10-02 14:41:48

标签: java jvm bytecode

根据JVM Specification, JVM有11种类型签名,其中之一是“方法类型”,我从没见过。它是什么 ?

1 个答案:

答案 0 :(得分:2)

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

JNI使用方法签名来确定(更精确地解析)要使用的方法。正如该文件指出的那样,这与JVM使用的方法相同。

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

  • 返回类型
  • 引发异常
  • 这是静态方法还是实例方法
  • 访问修饰符(公共,打包,受保护,私有)

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

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

在JNI中,方法签名是使用您链接到的页面上的语法定义的。

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

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)可以解析要为其返回标识的方法。