2011-03-18 28 views
10

Çalıştığım bir derleyici projesi için ASM API'sini karıştırmaya başladım. Bununla birlikte, belgelerin pek çok yerde yeni gelenler için daha az açık olduğunu buldum ve "Merhaba, Dünya!" Yazdıran bir sınıf oluşturma konusunda sağlam bir örnek olduğunu düşündüm. Burada sahip olmak için harika bir örnek olurdu.'Merhaba, Dünya!' Oluşturma Java ASM kütüphanesiyle sınıf

Şu anda, bir ana() ile (ClassWriter, ClassVisitor ve MethodVisitor sınıflarını kullanarak) bir sınıf oluşturabilirim, ancak ana gövdeyi nasıl oluşturacağımı göremiyorum. Herkes ASM bir sınıf dosyası oluşturma bana bir örnek verebilir misiniz:

  • bir ana()
  • içeren değerle ana yerel bir dize değişkeni() oluşturur "Merhaba, Dünya!"
  • baskılar değişken

cevap

13

Daha sonra eşdeğer bir sınıf oluşturmak için alacağını aramaları yazdırmak için asm olsun, java kullanarak bir sınıfı derlemek,

FAQ

ASMifierClassVisitor

ASMifierClassVisitor Javadocs aslında Merhaba vardır bunun içinde dünya kodu,

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

Eclipse kullanıyorsanız, sizin öğrenme yardım edecek büyük bir ASM plugin yoktur. Mevcut kodu, söz konusu kodun enstrümanı için gerekli asıl ASM çağrıları olarak gösterir. Belirli bir Java kodunu uygulamak için gereken ASM çağrılarını görebildiğiniz için öğrenmeniz oldukça faydalıdır.

+2

ASM API çağrılarının bayt kodu oluşturmasıyla ilgilenmekteydim ama kesinlikle bunu kesinlikle kontrol edecek. – seadowg