【发布时间】:2011-11-12 22:58:23
【问题描述】:
我正在使用 ASM Java 库从头开始生成一个类 X。在此类的其中一个静态方法中,我需要推送对X.class 的引用。由于还没有X.class,我不能使用visitLdcInsn。有没有办法做到这一点?
嗯,有可能(我目前正在使用它)生成以下代码 (new X().getClass()),但我确信这不是最干净的方法。
【问题讨论】:
标签: java code-generation bytecode
我正在使用 ASM Java 库从头开始生成一个类 X。在此类的其中一个静态方法中,我需要推送对X.class 的引用。由于还没有X.class,我不能使用visitLdcInsn。有没有办法做到这一点?
嗯,有可能(我目前正在使用它)生成以下代码 (new X().getClass()),但我确信这不是最干净的方法。
【问题讨论】:
标签: java code-generation bytecode
使用生成的代码,您通常不需要将类推入堆栈。您可以通过方法调用执行的任何操作通常都以字节码的形式提供。
假设你必须调用一个类的方法,你可以将它压入堆栈,无论它是否存在。
我使用的是 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.
【讨论】:
X 的静态方法