Нажатие на стек ссылки на класс начинаются с ASM - PullRequest
0 голосов
/ 08 сентября 2011

Я использую библиотеку ASM Java для создания класса X с нуля.Внутри одного из статических методов этого класса мне нужно нажать на ссылку X.class.Поскольку X.class пока нет, я не могу использовать visitLdcInsn.Есть ли способ сделать это?

Что ж, возможно (и я сейчас использую его) сгенерировать следующий код (new X().getClass()), но я уверен, что это не самый чистый способ сделать это.

1 Ответ

0 голосов
/ 08 сентября 2011

С сгенерированным кодом вам обычно не нужно помещать класс в стек.Все, что вы можете сделать с помощью вызова метода, обычно доступно в байтовом коде.

Скажем, вам нужно вызвать метод с классом, вы можете поместить его в стек независимо от того, существует он или нет.

Я использую 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);
  }
}

printints

// lots of code
mv.visitLdcInsn(Type.getType("LX;"));
// more code.
...