18

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

4

3 回答 3

23

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

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;>;>;
于 2012-11-06T05:13:36.217 回答
15

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

方法描述符表示方法采用的参数和返回的值

但...

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

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

于 2011-09-23T08:57:01.763 回答
6

“描述符”可能是指JVM 规范 § 4.3.3中定义的方法描述符。它描述了方法的参数类型和返回类型。它不包含方法名称。

“signatur”可能指的是Java 语言规范 § 8.4.2中定义的签名。它包含方法的名称以及参数类型。它不包含返回类型。

请注意,这两个术语是在两个不同的地方和不同的级别定义的。方法描述符存在于 JVM 级别,因此它与 Java语言完全分离。然而,签名是一个非常相似的概念,但作用于 Java语言级别(正如它在 JLS 中定义的那样)。

于 2011-09-23T09:00:31.073 回答