Pregunta

He comenzado a jugar con la ASM API para un proyecto de compilador en el que estoy trabajando. Sin embargo, estoy descubriendo que la documentación es menos clara para un recién llegado en muchos lugares y pensé que tener un buen ejemplo sólido de generar una clase que simplemente imprime "¡Hola, mundo!" Sería un gran ejemplo de tener aquí.

Actualmente, puedo generar una clase con un main () (usando las clases de classwriter, classVisitor y MethodVisitor), pero parece que no puedo resolver cómo generar el cuerpo de Main. ¿Alguien podría darme un ejemplo de generar un archivo de clase en ASM que:

  • contiene un main ()
  • Crea una variable de cadena local en main () con el valor "¡Hola, mundo!"
  • Imprime la variable
¿Fue útil?

Solución

Puede compilar una clase usando Java, luego obtener ASM para imprimir las llamadas que se necesitaría para generar una clase equivalente,

Preguntas más frecuentes

Asmifierclassvisor

El AsmifierClassVisitor Javadocs en realidad tiene el Código Hello World en él,

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();
  }
}

Otros consejos

Si está usando Eclipse, hay un gran Complemento ASM Eso ayudará a tu aprendizaje. Muestra el código Java existente como las llamadas ASM reales necesarias para instrumentar dicho código. Es bastante útil para aprender, ya que puede ver las llamadas ASM necesarias para implementar un código Java específico.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top