如何使用Jasmin中的“ LDC_W ”避免使用“恒定池中的非法类型”?
题
我正在编写一个生成茉莉代码的编译器,并想调用将类作为参数的方法。
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
我已经在Jasmin中修复了两个错误,但是我看不到将课程放入“ LDC_W”的常量池时,它在做什么错了,它将类放入常数池中的其他指令,例如“ new”和“ Anewarray) “正确。
我已经尝试在ASM中使用TraceClassVisitor查看.class文件,但它不会丢弃常数池。
有什么想法我接下来可以尝试什么?
解决方案
您必须确保该类的版本编号至少为49(请参阅此处的visitldcinsn ASM Javadoc页面).
不隶属于 StackOverflow