Создание " Привет, Мир!'класс с библиотекой JAVA ASM

Я начал возиться с API ASM для проекта компилятора, над которым я работаю. Тем не менее, я нахожу, что документация менее понятна для новичка во многих местах, и я подумал, что хороший пример создания класса, который просто печатает "Привет, Мир!- отличный пример для подражания.

В настоящее время я могу создать класс с main() (используя классы ClassWriter, ClassVisitor и MethodVisitor), но я не могу понять, как генерируйте тело main. Может ли кто-нибудь дать мне пример создания файла класса в ASM, который:

  • содержит main ()
  • создает локальную строковую переменную в main() со значением " Hello, World!"
  • печать переменной

2 ответов


вы можете скомпилировать класс с помощью java, а затем заставить asm распечатать вызовы, необходимые для создания эквивалентного класса,

часто задаваемые вопросы

ASMifierClassVisitor

asmifierclassvisitor javadocs на самом деле имеет код hello world в нем,

import org.objectweb.asm.*;

public class HelloDump implements Opcodes {

  public static byte[] dump() throws Exception {

     ClassWriter cw = new ClassWriter(0);
     FieldVisitor fv;
     MethodVisitor mv;
     AnnotationVisitor av0;

     cw.visit(49,
             ACC_PUBLIC + ACC_SUPER,
             "Hello",
             null,
             "java/lang/Object",
             null);

     cw.visitSource("Hello.java", null);

     {
         mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
         mv.visitVarInsn(ALOAD, 0);
         mv.visitMethodInsn(INVOKESPECIAL,
                 "java/lang/Object",
                 "<init>",
                 "()V");
         mv.visitInsn(RETURN);
         mv.visitMaxs(1, 1);
         mv.visitEnd();
     }
     {
         mv = cw.visitMethod(ACC_PUBLIC + ACC_STATIC,
                 "main",
                 "([Ljava/lang/String;)V",
                 null,
                 null);
         mv.visitFieldInsn(GETSTATIC,
                 "java/lang/System",
                 "out",
                 "Ljava/io/PrintStream;");
         mv.visitLdcInsn("hello");
         mv.visitMethodInsn(INVOKEVIRTUAL,
                 "java/io/PrintStream",
                 "println",
                 "(Ljava/lang/String;)V");
         mv.visitInsn(RETURN);
         mv.visitMaxs(2, 1);
         mv.visitEnd();
     }
     cw.visitEnd();

     return cw.toByteArray();
  }
}

Если вы используете Eclipse, есть большая плагин ASM это поможет вашему обучению. Он отображает существующий код Java как фактические вызовы ASM, необходимые для инструмента указанного кода. Это довольно полезно для обучения, поскольку вы можете видеть вызовы ASM, необходимые для реализации конкретного кода Java.