Я пишу компилятор, который генерирует код 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
Когда я собираю и запускаю его, я получаю:
Исключение в потоке "main" java.lang.VerifyError: (класс: 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"
он помещает классы в пул констант для других инструкций, таких как
"new" и "anewarray" правильно.
Я попытался просмотреть файлы .class с помощью TraceClassVisitor в ASM,
но он не сбрасывает постоянный пул.
Есть идеи, что я могу попробовать дальше?