Анализ байт-кода в Java
Я работаю над проектом анализа Bytecode, для которого я использую ASM. Все идет хорошо, я могу разобрать, получить информацию о классе и методе.
Но я застрял в понимании представления байт-кода для Generics. Вот один пример из java.util.list
, когда я использую visitMethod
из ClassVisitor
для печати информации, это то, что я получаю для одной из сигнатур метода:
(ILjava/util/Collection<+TE;>;)Z
Здесь я пытаюсь разобрать один за другим и понять аргументы метода:
-
I
означает int
-
Ljava/util/Collection
обозначает аргумент типа Collection
Но я застрял в типе дженериков, т.е. <+TE>
и т.д. Может ли кто-нибудь вести меня? Я попытался найти, но не получил достаточно информации. Если у кого-нибудь есть список имен байт-кодов, можете ли вы поделиться им?
Ответы
Ответ 1
+
обозначает общий extends
, а TE
означает, что существует тип var E
Таким образом, в исходном коде это будет выглядеть так:
Collection<? extends E> -> Ljava/util/Collection<+TE;>
Взгляните на руководство пользователя asm в разделе 4.1.1. Дженерики → Метаданные