14

現在取り組んでいるコンパイラ プロジェクトの ASM API をいじり始めました。しかし、ドキュメンテーションは多くの場所で新参者にとって明確ではないことがわかっており、単純に「Hello, World!」を出力するクラスを生成する良い確かな例があると思いました. ここにあるのは素晴らしい例です。

現在、(ClassWriter、ClassVisitor、および MethodVisitor クラスを使用して) main() を使用してクラスを生成できますが、メインの本体を生成する方法がわかりません。ASM でクラス ファイルを生成する例を教えてください。

  • main() を含む
  • 「Hello, World!」という値を持つローカル文字列変数を main() に作成します。
  • 変数を出力します
4

2 に答える 2

16

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();
  }
}
于 2011-03-18T01:39:30.160 に答える