AOP@Work:介绍AspectJ 5 - AspectJ中的Java 5支持和其他新特性抢鲜看 - 编程入门网
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 方法的 另一个变体:
可以静态地决定切入点表达式“execution(* process(..)) &&args (Number)”以总是 匹配这个方法的执行 —— 传递的参数保证是数字。相反,如 果编写的是“execution(* process(..)) &&args(Double)”,那么这个 表达式可能 匹配这个方法的执行,具体取决于实际运行时传递的参数的类型。在 这种情况下,AspectJ 应用运行时测试来判断参数是不是 instanceof Double。 现在再考虑一下采用参数化类型的 process 方法的以下签名:
然后应用相同的推断,就可以看出: execution(* process(..)) &&args(List<? extends Number>) 总是会匹配,因为不论传递什么类型的列表,都必须 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |