Анализ байт-кода в 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. Дженерики → Метаданные