多类型数组的JVM字段描述符

eni9jsuy  于 2022-11-07  发布在  其他
关注(0)|答案(2)|浏览(150)

我正在查看https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.3.2,我想知道如何显示一个接受2种不同类型的方法的正确形式。
例如:

callthismethod(String a, ArrayMap<String aa, Task<String aaa> > )

其中,任务是从com.this.location导入的
类型为int的示例变量的字段描述符就是I
类型为Object的示例变量的字段描述符为Ljava/lang/Object;。请注意,使用的是类Object的二进制名称的内部形式。
执行严修变数的字段描述项是多维double数组double d[][][],其为[[[D

w51jfk4q

w51jfk4q1#

当你看到一个 * 字段 * 描述符,却问一个关于 * 方法 * 的问题时,似乎有些混乱。因此,你必须查看“字段描述符”部分下面的 * 方法 * 描述符文档。
方法描述符的格式为
(参数描述符 * )返回描述符
其中参数描述符具有与字段描述符相同的形式,没有任何分隔符地连接,并且返回描述符与字段描述符的不同之处仅在于也允许V来表示void方法。
由于您的问题不包括返回类型,也没有显示第二个参数的限定名¹(我们可能假设第一个参数是java.lang.String),因此无法给出这个示例的完整答案。

void callthismethod(java.lang.String a, some.location.ArrayMap<String, Task<String>> aa)

方法描述符看起来像

(Ljava/lang/String;Lsome/location/ArrayMap;)V

注意,无论是字段描述符还是方法描述符,都不会对类型参数进行编码。泛型签名是完全不同的东西,只用于反射和调试,而不用于代码的正常执行。
由于缺少信息,获取示例的通用签名和获取方法描述符一样有问题。此外,com.this.location不是有效的包名。假设some.location也是Task,则通用签名看起来像

(Ljava/lang/String;Lsome/location/ArrayMap<Ljava/lang/String;Lsome/location/Task<Ljava/lang/String;>;>;)V

¹事实上,您的声明完全无效,因为它试图为类型参数而不是实参赋值。

8ehkhllq

8ehkhllq2#

这里没有数组,类型擦除意味着泛型不重要,所以这只是Ljava/lang/String;Lwhatever/package/ArrayMap;Task根本没有出现。

相关问题