2014-10-16 117 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