В чем разница между «дескриптором» и «подписью»? - PullRequest
12 голосов
/ 23 сентября 2011

Я сейчас использую ASM (библиотека инструментария Java bytecode).Чтобы получить подпись данного метода, есть поле с именем «desc».Я предполагаю, что это аббревиатура от «дескриптора», но почему он не назван как «подпись»?Есть ли разница между «дескриптором» и «подписью»?

Ответы [ 3 ]

12 голосов
/ 06 ноября 2012

В контексте 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;>;>;
10 голосов
/ 23 сентября 2011

В разделе 4.3.3 спецификации JVM , во-первых, дескриптор содержит тип возвращаемого значения, тогда как он не является частью сигнатуры метода.

Дескриптор метода представляет параметры, которые принимает метод, и значение, которое он возвращает

, но ...

Два метода имеютодна и та же подпись, если они имеют одинаковые имена и типы аргументов

(Учитывая это, также не ясно, что дескриптор содержит имя метода ...)

5 голосов
/ 23 сентября 2011

«дескриптор», вероятно, относится к дескриптору метода, как определено в спецификации JVM § 4.3.3 .Он описывает параметр types и тип возврата метода. не содержит имя метода.

"signatur", вероятно, относится к сигнатуре, определенной в Спецификации языка Java § 8.4.2 .Он содержит имя метода, а также типы параметров. не содержит тип возвращаемого значения.

Обратите внимание, что эти два термина определены в двух разных местах и ​​на разных уровнях.Дескриптор метода существует на уровне JVM, поэтому он довольно оторван от языка Java .Сигнатура, однако, очень похожа, но действует на уровне языка Java (как это определено в JLS).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...