快速业务通道

AOP的利器:ASM 3.0介绍 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16
aptor = new DelLoginClassAdapter(classWriter); ClassAdaptor accessClassAdaptor = new AccessClassAdaptor(delLoginClassAdaptor); ClassReader classReader = new ClassReader(strFileName); classReader.accept(classAdapter, ClassReader.SKIP_DEBUG);

AOP的利器:ASM 3.0介绍(7)

时间:2011-06-27 IBM 李夷磊 邱小侠 蔡一超

综上所述,ASM 的时序图如下:

图 4. ASM – 时序图

使用 ASM3.0 进行 AOP 编程

我们还是用上面的例子,给 Account 类加上 security check 的功能。与 proxy 编程不同,ASM 不需要将 Account 声明成接口,Account 可以仍旧是一个实现类。ASM 将直接在 Account 类上动手术,给 Account 类的 operation 方法首部加上对 SecurityChecker.checkSecurity 的调用。

AOP的利器:ASM 3.0介绍(8)

时间:2011-06-27 IBM 李夷磊 邱小侠 蔡一超

首先,我们将从 ClassAdapter 继承一个类。ClassAdapter 是 ASM 框架提供的一个默认类,负责沟通 ClassReader 和 ClassWriter。如果想要改变 ClassReader 处读入的类,然后从 ClassWriter 处输出,可以重写相应的 ClassAdapter 函数。这里,为了改变 Account 类的 operation 方法,我们将重写 visitMethdod 方法。

class AddSecurityCheckClassAdapter extends ClassAdapter{  public AddSecurityCheckClassAdapter(ClassVisitor cv) {  //Responsechain 的下一个 ClassVisitor,这里我们将传入 ClassWriter,  //负责改写后代码的输出  super(cv);  }  //重写 visitMethod,访问到 "operation" 方法时,  //给出自定义 MethodVisitor,实际改写方法内容  public MethodVisitor visitMethod(final int access, final String name,  final String desc, final String signature, final String[] exceptions) {  MethodVisitor mv = cv.visitMethod(access, name, desc, signature,exceptions); |-------10--------20--------30--------40--------50--------60--------70--------80--------9| |-------- XML error: The previous line is longer than the max of 90 characters ---------|  MethodVisitor wrappedMv = mv;  if (mv != null) {   //对于 "operation" 方法    if (name.equals("operation")) {   //使用自定义 MethodVisitor,实际改写方法内容   wrappedMv = new AddSecurityCheckMethodAdapter(mv);   }  }  return wrappedMv;  } }

下一步就是定义一个继承自 MethodAdapter 的 AddSecurityCheckMethodAdapter,在“operation”方法首部插入对 SecurityChecker.checkSecurity() 的调用。

class AddSecurityCheckMethodAdapter extends MethodAdapter {  public AddSecurityCheckMethodAdapter(MethodVisitor mv) {  super(mv);  }  public void visitCode() {  visitMethodInsn(Opcodes.INVOKESTATIC, "SecurityChecker",   "checkSecurity", "()V");  } }

其中,ClassReader 读到每个方法的首部时调用 visitCode(),在这个重写方法里,我们用visitMethodInsn(Opcodes.INVOKESTATIC, "SecurityChecker","checkSecurity", "()V"); 插入了安全检查功能。

最后,我们将集成上面定义的 ClassAdapter,ClassReader和ClassWriter 产生修改后的 Account 类文件:

import java.io.File; import java.io.FileOutputStream; import org.objectweb.asm.*; public class Genera

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号