Как избежать «незаконного типа в постоянном бассейне», используя «LDC_W » в Жасмине?

StackOverflow https://stackoverflow.com/questions/2784791

  •  03-10-2019
  •  | 
  •  

Вопрос

Я пишу компилятор, который генерирует код 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).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top