WEB开发网
开发学院软件开发Java Classworking 工具箱: 注释(Annotation)与 ASM 阅读

Classworking 工具箱: 注释(Annotation)与 ASM

 2010-03-18 00:00:00 来源:WEB开发网   
核心提示: 清单 4 给出了处理注释的代理和转换器类(在本例中是同一个类,但是这二者不一定要相同)实现,Classworking 工具箱: 注释(Annotation)与 ASM(6), transform() 实现使用 ASM 来扫描提供的二进制类表示,并寻找适当的注释,而修改后的二进制表示将被返回,否则

清单 4 给出了处理注释的代理和转换器类(在本例中是同一个类,但是这二者不一定要相同)实现。 transform() 实现使用 ASM 来扫描提供的二进制类表示,并寻找适当的注释,收集关于该类的带注释字段的信息。如果找到带注释的字段,该类将被修改以包含生成的 toString() 方法,而修改后的二进制表示将被返回。否则 transform() 方法只返回 null,表明没有必要进行修改。

清单 4. 代理和转换器类

package com.sosnoski.asm; 
import java.lang.instrument.ClassFileTransformer; 
import java.lang.instrument.IllegalClassFormatException; 
import java.lang.instrument.Instrumentation; 
import java.security.ProtectionDomain; 
import org.objectweb.asm.ClassReader; 
import org.objectweb.asm.ClassWriter; 
public class ToStringAgent implements ClassFileTransformer 
{ 
  // transformer interface implementation 
  public byte[] transform(ClassLoader loader, String cname, Class class, 
    ProtectionDomain domain, byte[] bytes) 
    throws IllegalClassFormatException { 
    System.out.println("Processing class " + cname); 
    try { 
       
      // scan class binary format to find fields for toString() method 
      ClassReader creader = new ClassReader(bytes); 
      FieldCollector visitor = new FieldCollector(); 
      creader.accept(visitor, true); 
      FieldInfo[] fields = visitor.getFields(); 
      if (fields.length > 0) { 
         
        // annotated fields present, generate the toString() method 
        System.out.println("Modifying " + cname); 
        ClassWriter writer = new ClassWriter(false); 
        ToStringGenerator gen = new ToStringGenerator(writer, 
            cname.replace('.', '/'), fields); 
        creader.accept(gen, false); 
        return writer.toByteArray(); 
         
      } 
    } catch (IllegalStateException e) { 
      throw new IllegalClassFormatException("Error: " + e.getMessage() + 
        " on class " + cname); 
    } 
    return null; 
  } 
   
  // Required method for instrumentation agent. 
  public static void premain(String arglist, Instrumentation inst) { 
    inst.addTransformer(new ToStringAgent()); 
  } 
} 

上一页  1 2 3 4 5 6 7 8 9 10  下一页

Tags:Classworking 工具箱 注释

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接