Как избежать «незаконного типа в постоянном бассейне», используя «LDC_W » в Жасмине?
Вопрос
Я пишу компилятор, который генерирует код Jasmin и захочет вызвать метод, который принимает класс в качестве параметра.
public class CTest
{
public static void main(String[] args)
throws Exception
{
java.lang.reflect.Array.newInstance(CTest.class, 0);
}
}
Так что в Жасмине, я думаю, что это должно быть:
.class public CTest2
.super java/lang/Object
.method public static main([Ljava/lang/String;)V
.limit stack 2
.limit locals 1
ldc_w CTest2
iconst_0
invokestatic java/lang/reflect/Array/newInstance(Ljava/lang/Class;I)Ljava/lang/Object;
pop
return
.end method
Когда я собираю это и запустите его, я получаю:
Исключение в потоке «Главная» Java.lang.veryifyError: (класс: ctest2, метод: главная подпись: ([ljava / lang / string;) v) нелегальный тип в постоянном бассейне
Глядя на разобранный код для обоих CTEST.Class (версия Java) и CTEST2.class (версия Jasmin) с «Javap -C -Verbose», они оба, кажется, устанавливают постоянный пул так же:
const #2 = class #16; // CTest
const #16 = Asciz CTest;
0: ldc_w #2; //class CTest
const #14 = Asciz CTest2;
const #17 = class #14; // CTest2
0: ldc_w #17; //class CTest2
Я уже зафиксировал две ошибки в Жасмине, но я не вижу, что он делает не так, когда положить класс в постоянном бассейне для «LDC_W», он ставит классы в постоянном бассейне для других инструкций, таких как «новый» и «Anewarray». «Правильно.
Я пытался смотреть на файлы .Class с Traceclassvisitor в ASM, но он не сбрасывает постоянный пул.
Любые идеи, что я могу попробовать дальше?
Решение
Вы должны убедиться, что номер версии класса не менее 49 (см. В гости Страница ASM Javadoc).