Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 什么';s JVM类型签名的方法类型_Java_Jvm_Bytecode - Fatal编程技术网

Java 什么';s JVM类型签名的方法类型

Java 什么';s JVM类型签名的方法类型,java,jvm,bytecode,Java,Jvm,Bytecode,据报道,, JVM有11个类型签名,其中一个是“方法类型”,我从未见过。这是什么 正如Holger指出的,您链接到的文档是针对Java本机接口(JNI)的,而不是JVM规范 JNI使用方法签名来确定(更精确地解析)使用哪个方法。正如文档所指出的,这与JVM使用的方法相同 方法签名允许唯一标识方法。Java语言有方法重载的概念,这意味着一个类中可以有多个同名的方法。编译器如何区分它们是使用方法签名,该签名由方法名称、泛型类型参数(如果有)及其参数的数量和类型组成。重要的是要理解只有这些值用于签名。

据报道,,
JVM有11个类型签名,其中一个是“方法类型”,我从未见过。这是什么

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

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

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

  • 返回类型
  • 抛出异常
  • 这是静态方法还是实例方法
  • 访问修饰符(public、package、protected、private)
这意味着即使返回类型不同或抛出不同的异常,也不能有两个具有相同名称且参数数量和类型相同的方法。(详见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)可以解析返回标识的方法。

这不是“JVM规范”,而是JNI文档。当你说“我从来没见过”的时候,你看了哪里?方法签名在任何需要方法签名的地方都使用,如图所示,签名确实包含返回类型。这与java语言根本不同,它不考虑返回类型。谢谢,我已经编辑了我的答案,使这个区别更清楚。我会把注释放在<代码>返回类型< /Cord>列表项中。