快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16
tor{  public static void main() throws Exception {  ClassReader cr = new ClassReader("Account");  ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);  ClassAdapter classAdapter = new AddSecurityCheckClassAdapter(cw);  cr.accept(classAdapter, ClassReader.SKIP_DEBUG);  byte[] data = cw.toByteArray();  File file = new File("Account.class");  FileOutputStream fout = new FileOutputStream(file);  fout.write(data);  fout.close();  } }

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

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

执行完这段程序后,我们会得到一个新的 Account.class 文件,如果我们使用下面代码:

public class Main {  public static void main(String[] args) {  Account account = new Account();  account.operation();  } }

使用这个 Account,我们会得到下面的输出:

SecurityChecker.checkSecurity ... operation...

也就是说,在 Account 原来的 operation 内容执行之前,进行了 SecurityChecker.checkSecurity() 检查。

将动态生成类改造成原始类 Account 的子类

上面给出的例子是直接改造 Account 类本身的,从此 Account 类的 operation 方法必须进行 checkSecurity 检查。但事实上,我们有时仍希望保留原来的 Account 类,因此把生成类定义为原始类的子类是更符合 AOP 原则的做法。下面介绍如何将改造后的类定义为 Account 的子类 Account$EnhancedByASM。其中主要有两项工作:

改变 Class Description, 将其命名为 Account$EnhancedByASM,将其父类指定为 Account。

改变构造函数,将其中对父类构造函数的调用转换为对 Account 构造函数的调用。

在 AddSecurityCheckClassAdapter 类中,将重写 visit 方法:

public void visit(final int version, final int access, final String name,  final String signature, final String superName,  final String[] interfaces) {  String enhancedName = name + "$EnhancedByASM"; //改变类命名   enhancedSuperName = name; //改变父类,这里是”Account”  super.visit(version, access, enhancedName, signature,  enhancedSuperName, interfaces); }

改进 visitMethod 方法,增加对构造函数的处理:

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);  MethodVisitor wrappedMv = mv;  if (mv != null) {  if (name.equals("operation")) {   wrappedMv = new AddSecurityCheckMethodAdapter(mv);  } else if (name.equals("<init>")) {   wrappedMv = new ChangeToChildConstructorMethodAdapter(mv,   enhancedSuperName);  }  }  return wrappedMv; }

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

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

这里 ChangeToChildConstructorMethodAdapter 将负责把 Account 的构造函数改造成其子类 Account$EnhancedByASM 的构造函数:

class ChangeToChildConstructorMethodAdapter extends MethodAdapter {  private String superClassName;  public ChangeToChildConstructorMethodAdapter(MethodVisitor mv,  String superClassName) {  su

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