【问题标题】:Pushing to stack reference to the class begin generated with ASM推送到堆栈引用开始使用 ASM 生成的类
【发布时间】:2011-11-12 22:58:23
【问题描述】:

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

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

【问题讨论】:

    标签: java code-generation bytecode


    【解决方案1】:

    使用生成的代码,您通常不需要将类推入堆栈。您可以通过方法调用执行的任何操作通常都以字节码的形式提供。

    假设你必须调用一个类的方法,你可以将它压入堆栈,无论它是否存在。

    我使用的是 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.class'作为参数的方法,所以我需要将X.class推入堆栈
    • 我添加了一个例子。除非您的意思是要使用 X 的静态方法
    • 对不起,在你完成之前我正在阅读。我猜 Type.getType("LX;") 正是我需要的。我会看看 ASMifier,我想它可以在这里简化很多事情。谢谢!
    • 在一个项目中,我用它生成了超过 1000 行我不需要编写的代码。 ;) 我从一个“模板”开始,其中包含我想要支持的所有组合,然后在使用此工具后对其进行概括。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-30
    • 1970-01-01
    • 2017-03-02
    • 2013-05-21
    • 2019-04-26
    相关资源
    最近更新 更多