快速业务通道

AOP@Work:介绍AspectJ 5 - AspectJ中的Java 5支持和其他新特性抢鲜看 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15
t<T> {   private T data;   public T getData() {    return data;   }   public void setData(T data) {    this.data = data;   }  }  aspect DataHistory {   private E DataBucket<E>.previousDataValue;   private E DataBucket<E>.getPreviousDateValue() {    return previousDataValue;   }  }

注意,类型间声明中使用的类型参数名称不必与 DataBucket 类本身声明中使 用的类型参数名称对应;相反,类型的 签名 必须匹配(类型参数的数量,以及 通过 extends 或 super 子句放在类型参数上的限制)。

这一节的其余部分,我把重点放在切入点表达式中通用签名和类型的匹配上。 在随后的讨论中,把切入点指示符分成两种类型是有帮助的:一类是基于静态签 名进行匹配的切入点指示符(execution、call、get、 set ,等等),另一类是 根据运行时类型信息进行匹配的切入点指示符(this、target、args)。由于存 在叫做 擦除(erasure) 的东西(我马上就会介绍),所以这个区分很重要。

AOP@Work:介绍AspectJ 5 - AspectJ中的Java 5支持和其他新特性抢鲜看(8)

时间:2011-09-04 IBM Adrian Colyer

匹配通用签名和类型

对于基于签名进行匹配的切入点指示符,AspectJ 采取了一种简单方式:类型 的类型参数规范就是签名的一部分。 例如,以下方法都是不同的签名:

void process(List<Number> numbers)

void process(List<? extends Number> numbers)

void process(List<?> items)

这些方法的执行可以用以下切入点分别匹配:

execution(* process(List<Number>))

execution(* process(List<? extends Number>))

execution(* process(List<?>))

AspectJ 在匹配类型的时候,支持 * 和 + 通配符。表达式“execution(* process(List<*>))”匹配全部三个 process 方法,因为 * 匹配任何类型 。但是,表达式“execution(* process(List<Number+>))“只匹配第一个 process 方法(Number 由模式 Number+ 匹配),但是 不匹配 第二个或第三个 。可以把模式 List<Number+> 扩展到与 List<Float>、 List<Double>、List<Integer> 等匹配,但是对于 List<? extends Number> 来说,这些都是不同的签名。有一个重要的区别是,请考虑 这样一个事实:在 process 方法的方法体内,用没有通配的签名插入列表是合法 的,但是在使用 ? extends 格式的时候就不合法了。

需要记住的规则是:泛型通配符是签名的组成部分,而且 AspectJ 模式通配 符被用来 匹配 签名。

基于运行时类型信息的匹配

在根据运行时类型信息进行匹配时,事情变得更有趣了。this、target 和 args 切入点指示符全都根据运行时类型信息进行匹配。请考虑 process 方法的 另一个变体:

void process(Number n) {...}

可以静态地决定切入点表达式“execution(* process(..)) &&args (Number)”以总是 匹配这个方法的执行 —— 传递的参数保证是数字。相反,如 果编写的是“execution(* process(..)) &&args(Double)”,那么这个 表达式可能 匹配这个方法的执行,具体取决于实际运行时传递的参数的类型。在 这种情况下,AspectJ 应用运行时测试来判断参数是不是 instanceof Double。

现在再考虑一下采用参数化类型的 process 方法的以下签名:

void process(List<? extends Number> ns) {...}

然后应用相同的推断,就可以看出:

execution(* process(..)) &&args(List<? extends Number>) 总是会匹配,因为不论传递什么类型的列表,都必须

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