“描述符”和“签名”有什么区别?

2022-09-02 19:42:39

我现在正在使用ASM(Java字节码检测库)。要检索给定方法的签名,有一个名为“desc”的字段。我猜这是“描述符”的缩写,但为什么不叫“签名”呢?“描述符”和“签名”之间有什么区别吗?


答案 1

在 asm 的上下文中,您关心内部名称、方法描述符、类型描述符和签名。章节编号来自 asm 文档

2.1.2 内部名称

“类的内部名称只是该类的完全限定名称,其中的点被替换为斜杠。

com/snark/Boojum

2.1.3 类型描述符

[[Ljava/lang/Object;

2.1.4 方法描述符

方法描述符是类型描述符的列表,这些描述方法的参数类型和返回类型,在单个字符串中。

int[] m(int i, String s) becomes (ILjava/lang/String;)[I

4.1. 泛型(用于签名)

“出于向后兼容性的原因,有关泛型类型的信息不存储在类型或方法描述符中(这些描述符早在Java 5中引入泛型之前就已定义),而是存储在称为类型,方法和类签名的类似结构中。

这个Java:

List<List<String>[]>

成为此签名:

Ljava/util/List<[Ljava/util/List<Ljava/lang/String;>;>;

答案 2

看看 JVM 规范第 4.3.3 节,首先,描述符包含返回类型 - 而这不是方法签名的一部分。

方法描述符表示该方法采用的参数及其返回的值

但。。。

如果两个方法具有相同的名称和参数类型,则它们具有相同的签名

(鉴于此,也不清楚描述符是否包含方法的名称...)