AspectNet是一个基于.Net Framework的方面编制器,它同时能实现静态编织和动态编织,是bobmazelin个人的研究性项目,现仍然处于开发阶段,有关AOP概念的介绍请参考:www.aspectJ.org以及IBM的专题.
在上一篇中我介绍了AspectNet的基本结构,从这篇开始我会具体介绍AspectNet在静态编织方面的功能.这次我给大家介绍call和execution两个pointcut.
在上篇中我提过pointcut捕获了需要织入的代码点,在AspectNet中存在着多种捕获这种代码点的方式,call和execution是其中比较基础的两种.
1.call pointcut: 捕获了调用某些方法的代码点;
2.execution pointcut:捕获了执行某些方法的代码点.
它们非常相似,我在下文会通过一个小例子来展示它们之间的区别.
在给出例子之前,我先说明一下它们的方法模式:
修饰符 返回值类型 [方法类型.]方法名称(参数类型列表)
1.修饰符是public, protected,private,sealed,static等,它们支持!以及并操作(比如: !private static);
2.返回值类型就是方法的返回值类型,它支持void,*, &&, ||, !,+操作符.void就是没有返回值;*是通配符,单独的*代表任意类型,也可以部分通配,比如:System.*,Customer*.Order*等等;&&, ||, !可以组合不同的类型;+是子类操作符,代表包括其所有子类,比如:System.Object+,就代表了所有的类;
3.方法类型描述了方法声明了类型,它和返回值类型的模式类似;注:在AspectNet中它不能被忽略;
4.方法名称只支持*和new操作符,new代表类的构造函数;
5.参数类型列表:通过,来分割参数类型,它支持..操作符来表示任意多了参数,比如:System.Int,..,string就表述方法的第一个参数和最后一个参数的类型,中间不限制参数的个数和类型.
注:上面对AspectNet的方法模式的描述并不全面.
理论讲完了,来点实际的,由于还没有到参数的传递阶段,我选择了最为简单的log为实例,等到介绍参数时再给出业务相对复杂的例子,这个例子主要说明两个问题,第一: 通过+来捕获子类代码点;第二,call和execution的区别.