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 的标识。
根据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 的标识。