2011-03-18 25 views
10

के साथ कक्षा मैंने एक कंपाइलर प्रोजेक्ट के लिए एएसएम एपीआई के साथ गड़बड़ करना शुरू कर दिया है जिस पर मैं काम कर रहा हूं। हालांकि, मुझे लगता है कि दस्तावेज कई स्थानों पर एक नवागंतुक के लिए स्पष्ट से कम है और मैंने सोचा कि एक वर्ग उत्पन्न करने का एक अच्छा ठोस उदाहरण है जो "हैलो, वर्ल्ड!" प्रिंट करता है। यहां पर एक महान उदाहरण होगा।एक 'हैलो, वर्ल्ड!' उत्पन्न करना जावा एएसएम लाइब्रेरी

वर्तमान में, मैं एक मुख्य() (क्लासवाइटर, क्लासविजिटर और मेथडविजिटर कक्षाओं का उपयोग करके) उत्पन्न कर सकता हूं लेकिन मुझे लगता है कि मुख्य शरीर को कैसे उत्पन्न किया जाए। किसी को भी मुझे एएसएम में एक वर्ग फ़ाइल है कि पैदा करने का एक उदाहरण दे सकता है:

  • main()
  • शामिल मूल्य के साथ मुख्य में एक स्थानीय स्ट्रिंग वैरिएबल() बनाता है "नमस्कार, दुनिया!"
  • प्रिंट चर

उत्तर

13

आप एक वर्ग जावा का उपयोग कर संकलन कर सकते हैं, तो कॉल यह एक बराबर वर्ग उत्पन्न करने के लिए ले जाएगा बाहर मुद्रित करने के लिए एएसएम मिलता है,

FAQ

ASMifierClassVisitor

ASMifierClassVisitor javadocs वास्तव में हैलो है इसमें विश्व कोड,

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 कि अपने सीखने सहायता करेगा है। यह मौजूदा जावा कोड को वास्तविक एएसएम कॉल के रूप में प्रदर्शित करता है क्योंकि उपकरण ने कोड कहा था। यह सीखने के लिए काफी उपयोगी है क्योंकि आप विशिष्ट जावा कोड को लागू करने के लिए आवश्यक एएसएम कॉल देख सकते हैं।

+2

मैं बाइटकोड उत्पन्न करने के लिए एएसएम एपीआई कॉल से अधिक चिंतित था लेकिन मैं वैसे भी निश्चित रूप से यह जांच लेंगे। – seadowg