В чем разница между "дескриптором" и "подписью"?

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

3 ответов


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

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

но...

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

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


в контексте 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), но в подобных конструкциях называется type, метод и классовые подписи."

Это Java:

List<List<String>[]>

становится такой подписью:

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

"дескриптор", вероятно, относится к дескриптору метода, как определено в спецификация JVM § 4.3.3. Он описывает параметр типы и возвращаемый тип метода. Это не содержит имя метода.

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

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