2011-03-18 3 views
10

저는 작업중인 컴파일러 프로젝트에 ASM API를 사용하는 것을 시작했습니다. 그러나 나는 문서화가 많은 곳에서 새로 온 사람들을 위해 명확하지 않다는 것을 알고 있으며 간단하게 "Hello, World!"를 출력하는 클래스를 생성하는 좋은 예를 가지고 있다고 생각했습니다. 여기에있는 좋은 예가 될 것입니다.'Hello, World!'생성하기 Java ASM 라이브러리를 사용하는 클래스

현재 main() (ClassWriter, ClassVisitor 및 MethodVisitor 클래스 사용)을 사용하여 클래스를 생성 할 수 있지만 main 본문을 생성하는 방법을 생각할 수 없습니다. 사람이 ASM의 클래스 파일을 생성하는 나에게 예를 들어 줄 수 :

  • 이 주()
  • 를 포함하면 값이 메인에서 지역 문자열 변수() 생성 "안녕하세요, 세계!"
  • 인쇄 변수

답변

13

그런 다음이 동등한 클래스를 생성하는 데 걸리는 전화를 인쇄 할 ASM을 얻을 자바를 사용하여 클래스를 컴파일 할 수 있습니다,

FAQ

ASMifierClassVisitor

ASMifierClassVisitor의 JavaDoc을 실제로 안녕하세요있다

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

이클립스를 사용하는 경우, 학습에 도움이됩니다 좋은 ASM plugin있다. 이 코드는 기존 Java 코드를 실제 ASM 호출로 표시하여 해당 코드를 계측하는 데 필요합니다. 특정 Java 코드를 구현하는 데 필요한 ASM 호출을 볼 수 있으므로 학습에 매우 유용합니다.

+2

바이트 코드를 생성하는 ASM API 호출에 더 많은 관심이 있었지만 어쨌든 이것을 확실히 체크 할 것입니다. – seadowg

관련 문제