Класс Frame ASM не имеет универсального типа
Документация ASM (pdf) гласит, что Frame
класс имеет универсальный тип, предоставляя пример использования: Frame<BasicValue>
, (на стр. 119, если необходимо)
Глядя на источник, мы видим, что это объявление Frame<V extends Value>
,
Но по какой-то причине, когда в моем проекте я указываю maven-зависимости,
<dependency>
<groupId>org.ow2.asm</groupId>
<artifactId>asm</artifactId>
<version>4.2</version>
</dependency>
<dependency>
<groupId>org.ow2.asm</groupId>
<artifactId>asm-analysis</artifactId>
<version>4.2</version>
</dependency>
или просто загрузите соответствующие артефакты вручную из репозитория, попробуйте использовать Frame<...>
заканчивается ошибкой:
Type org.objectweb.asm.tree.analysis.Frame doesn't have type parameters
А также Intellij IDEA
декомпилятор говорит Frame
действительно нет никого.
Та же самая проблема имеет место с Analyzer
а также Interpreter
классы.
Как я могу победить это?
2 ответа
В дополнение к ответу @dejvuth:
asm-debug-all имеет версию Java 5.0 и содержит все общие типы. Более того, он совместим в двоичном формате с простой библиотекой asm без обобщений
Из ASM FAQ
14. Какой самый ранний JDK требуется для использования ASM?
...
Для пакетов asm.util и asm.tree требуется JDK 1.2, ...
и история ASM 4.0 RC1
генерируется API для использования обобщений и переменных. Тем не менее, почти все банки все еще маленькие и совместимы с 1.2.
В основном, когда происходит Jarred, ASM оптимизирует байт-код, что (среди прочего) делает его обратно совместимым с 1.2, изменяя его основную версию на 46 (см. org.objectweb.asm.optimizer.ClassOptimizer
).
Я предполагаю, что есть два варианта: использовать его без обобщений или скомпилировать источник самостоятельно.