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)
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>列表项中。