我正在使用ASM Java库从头开始生成类X
。在此类的一个静态方法中,我需要将引用推送到X.class
。由于还没有X.class
我无法使用visitLdcInsn
。有办法吗?
嗯,有可能(我现在正在使用它)生成以下代码(new X().getClass())
,但我确信这不是最干净的方法。
答案 0 :(得分:0)
使用生成的代码,您通常不需要将类推入堆栈。您可以使用方法调用执行的任何操作通常都以字节代码形式提供。
假设您必须使用类调用方法,无论是否存在,都可以将其推送到堆栈中。
我使用的东西是ASMifier。这很有用,因为您可以从一个编译并执行您想要的模板的类开始,并让它转储重新创建类所需的所有代码。这意味着您不需要自己编写大部分代码。
public class Main {
public static void main(String... args) throws IOException {
ASMifierClassVisitor cv = new ASMifierClassVisitor(new PrintWriter(System.out));
ClassReader cr = new ClassReader("X");
cr.accept(cv, 0);
}
}
class X {
{
System.out.println("Inside class "+X.class);
}
}
打印
// lots of code
mv.visitLdcInsn(Type.getType("LX;"));
// more code.