使用ASM生成对类开始的堆栈引用

时间:2011-09-08 12:19:35

标签: java code-generation bytecode

我正在使用ASM Java库从头开始生成类X。在此类的一个静态方法中,我需要将引用推送到X.class。由于还没有X.class我无法使用visitLdcInsn。有办法吗?

嗯,有可能(我现在正在使用它)生成以下代码(new X().getClass()),但我确信这不是最干净的方法。

1 个答案:

答案 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.