2014-10-16 75 views
0

我想使用ASM創建一個簡單的類文件ASM創建Java類

我已經試過如下:

ClassPrinter c = new ClassPrinter(); 
    ClassReader cr = new ClassReader(new FileInputStream("path/to/class")); 
    ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS|ClassWriter.COMPUTE_FRAMES); 
    cw.newClass("MyClass"); 
    cw.newField("owner", "value", "I"); 
    cr.accept(c, 0); 
    for(String s : c.values){ 
     System.out.println(s); 
    } 
    ClassReader writerReader = new ClassReader(new FileInputStream("C:\\generated.class")); 
    writerReader.accept(cw,0); 

然而,有創建ClassReader時是一個ArrayIndexOutOfBoundsException。

C:\ generated.class現在是一個空文件。

ClassPrinter是簡單地遍歷所有的實體和他們使用System.out.println

打印訪客如何才能做到這一點?

我需要能夠從頭開始創建類,而不僅僅是附加到已經存在的類。

依賴關係:

<dependency> 
    <groupId>org.ow2.asm</groupId> 
    <artifactId>asm</artifactId> 
    <version>5.0.3</version> 
</dependency> 

回答

0

你似乎從來不寫文件 「C:\ generated.class」

什麼是鉻,什麼是C在你的代碼片段?

看起來像這樣的事情,你打開在讀者面前丟失:

String filename = "C:\\generated.class"; 

// Generate class 

System.out.println("Generating MyClass"); 
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS|ClassWriter.COMPUTE_FRAMES); 
cw.newClass("MyClass"); 
cw.newField("owner", "value", "I"); 

// Print generated class to STDIO to see that is generated as expected 

System.out.println("Generated:"); 
ClassPrinter cp = new ClassPrinter(); 
cp.accept(cw, 0); 

// Write the generated class to a file 

System.out.println("Writing " + filename); 
FileOutputStream os = new FileOutputStream(filename); 
os.write(cw.toByteArray()); 
os.close(); 

// Read the file back 

System.out.println("Reading " + filename); 
ClassReader cr = new ClassReader(new FileInputStream("C:\\generated.class")); 

// Print the class 

System.out.println("Read"); 
cr.accept(c, 0); 
cr.accept(cw,0); 
+0

我說這並beign產生writerReader很好,但是當我接受我得到A零位指針異常。請注意,如果使用ASM讀取的結果爲null,則寫入的文件擴展爲空{} – mangusbrother 2014-10-17 05:26:08

+0

不完全確定代碼中出了什麼問題,但您似乎在寫入類之前創建了讀取器。我已經擴展了這個例子,使其更加完整。 – 2014-10-17 08:24:49