快速业务通道

基于Eclipse RCP简化IoC实现 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-21
    ConstructorVisitor cv = new ConstructorVisitor();     ClassAnnotationVisitor cav = new ClassAnnotationVisitor(cv);     creader.accept(cav, true);     if (cv.getConstructors().size() > 0) {      System.out.println("Enhancing "+className);      //生成增强的构造器类      ClassWriter cw = new ClassWriter(false);      ClassConstructorWriter writer = new ClassConstructorWriter(cv.getConstructors(),cw);      creader.accept(writer, false);      return cw.toByteArray();     }     else      return null;    }    public static void premain(String agentArgs, Instrumentation inst) {     inst.addTransformer(new IOCTransformer());    }   }

基于Eclipse RCP简化IoC实现(4)

时间:2011-01-05 天极 朱先忠

上面代码中,类ConstructorVisitor,ClassAnnotationVisitor,ClassWriter和ClassConstructorWriter负责使用ObjectWeb ASM库进行字节码操作。

ASM使用访问者模式来把类数据(包括指令序列)处理为事件流。在解码一个现有类时,ASM为我们生成事件流,并调用我们的方法来处理事件。当生成一个新类时,相反的事情发生了:我们生成了一个事件流-由ASM库负责把它转换成一个生成的类。注意,这种方法并不依赖于使用的特定的字节码库(在我们的例子中,使用的是ASM);其它一些可用的方案,例如BCEL或Javassist,也可以良好地实现这一工作。

在此,我们不会详细涉及ASM的内部机理。在本文中,仅了解ConstructorVisitor和ClassAnnotationVisitor对象用于标识标有可服务的注解的类并且负责收集它们的构造器已经足够了。它们的源码如下所示:

public class ClassAnnotationVisitor extends ClassAdapter {   private boolean matches = false;   public ClassAnnotationVisitor(ClassVisitor cv) {    super(cv);   }   @Override   public AnnotationVisitor visitAnnotation(String desc, boolean visible) {    if (visible &&desc.equals("Lcom/onjava/servicelocator/annot/Serviceable;")) {     matches = true;    }    return super.visitAnnotation(desc, visible);   }   @Override   public MethodVisitor visitMethod(    int access,    String name,    String desc,    String signature,    String[] exceptions) {     if (matches)      return super.visitMethod(access,name,desc,signature,exceptions);     else {      return null;    }   } } public class ConstructorVisitor extends EmptyVisitor {   private Set<Method> constructors;   public ConstructorVisitor() {    constructors = new HashSet<Method>();   }   public Set<Method> getConstructors() {    return constructors;   }   @Override   public MethodVisitor visitMethod(    int access,    String name,    String desc,    String signature,    String[] exceptions) {     Type t = Type.getReturnType(desc);     if (name.indexOf("<init>") != -1 && t.equals(Type.VOID_TYPE)) {      constructors.add(new Method(name,desc));     }     return super.visitMethod(access,name,desc,signature,exceptions);    }   }

对于前面的类所收集到的每一个构造器,由一个ClassConstructorWriter的实例来修改它-通过下面的调用注入到插件Service Locat

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号