第五章 Slices
本章定义slice声明的语法和语义。下一章介绍为什么advice可以利用slice引入代码。目前,Aspect C++中只定义了类slice(class slices)
5.1 class slice声明
class slice可以在任何类域或名字空间中声明。只能定义一次,但可以有多次前向声明。如果class slice已经在某个作用域中声明过,然后又重新声明或定义的话,可以在名字前面加上修饰符,用来表明作用域,如下例所示:
slice class ASlice;
namespace N {
slice class ASlice; // 不同的slice!
}
slice class ASlice { //定义全局的slice,即::ASlice
int elem;
};
slice class N::ASlice { // 定义名字空间N中的slice,即N::ASlice
long elem;
};
如果class slice只定义基类,可以使用缩写语法:
slice class Chained : public Chain; //也就是不要大括号了。
class slice可以没有名字,但这只在作为advice声明的一部分时才有意义。class slice的声明中可以用aspect或struct关键字代替class。class slice和aspect slice之间没有区别,但是struct slice和class slice间有区别,他们中的元素引入到目标class后,对这些元素的默认访问权限不同,struct slice的是public,而class slice的是private。不允许在class slice中声明aspect、pointcut、advice和slice作为slice的成员。
class slice可以有不在slice声明体内定义的成员,例如:静态属性或非内联函数:
slice class SL {
static int answer;
void f();
};
//...
slice int SL::answer = 42;
slice void SL::f() { ... }
这些外部成员声明必须在相应slice声明之后才能出现。
第六章 Advice
本章介绍Aspect C++中不同类型的advice。advice被分为两类,一类是面向运行中程序的动态控制流中的join point的advice,例如函数调用或执行;另异类是面向静态join point的advice,例如引入class。
不管对于那种类型的advice,编译器保证包含adcice定义的aspect头文件的代码比join point处代码先编译。
6.1 动态join point的advice
before(…): advice代码的执行先于pointcut中指定的join point;
after(…):advice代码的执行后于pointcut中指定的join point;
around(…):advice代码的执行代替pointcut中指定的join point。
6.2 静态join point的advice
Aspect C++的静态join point是class或aspect。class或aspect的advice能引入新成员或引入基类。新成员或基类在目标类中的类型是private、protected还是public,这取决于aspect中advice声明的保护。
baseclass(classname) 为pointcut中的类引入新基类“classname”;
引入新成员是通过slice
只有在目标上下文环境中才能对引入声明从语意上进行分析。因此,声明可能会引用一些东西,比如说类型或常量,这些类型或常量只有在目标类中才有意义,在aspect定义中不存在。如果需要引入构造函数或析构函数,那么aspect的名字就要和构造或析构函数名字一样。
非内联的introduction可用于引入静态属性、以及声明和定义分开的成员函数。引入的成员的名字需要加上表示它属于哪个aspect的限定。
第七章 JoinPoint API
本章介绍JoinPoint的API。
7.1 类型
类型 | 说明 |
Result | 函数的返回值类型; |
That | 对象类型(对象是初始化call的对象); |
Target | 目标对象类型(call的目标对象) |
初始化call的对象:这样翻译不知对不对,例如:obj.call(),那么初始化call的对象就是obj。
call的目标对象:这个可以参见前面,tjp->target()->m_Instance。
7.2 函数
表 静态函数
函数 | 说明 |
static AC::Type type() | 返回join point的类型码,类型码依照C++ ABI V3标准; |
static int args() | 返回call的参数个数,并执行join point; |
static AC::Type argtype(int number) | 返回第number个形参的类型码,类型码依照C++ ABI V3标准; |
static const char *signature() | 返回对join point的描述,描述是文本形式的; |
static unsigned int id() | 返回join point的数字id号,这个id号是唯一的; |
static AT::Type resulttype() | 返回结果类型,类型码依照C++ ABI V3标准; |
static AC::JPType jptype() | 返回描述join point 类型的标识,这个标识是唯一的。 |
表 非静态函数
函数 | 说明 |
void *arg(int number) | 返回指针,这个指针指向的是存放第number个参数的内存空间; |
Result *result() | 返回指向函数返回值的指针,如果函数没有返回值,那么返回0; |
That *that() | 返回指针,指针指向的是初始化call的对象;如果call的是静态函数或全局函数,没有初始化call的对象,那么返回0; |
Target *target() | 返回指针,指针指向call的目标,如果call的是静态函数或全局函数,那么返回0; |
void proceed() | 在around()的advice中实现对join point代码的执行,他是通过调用action().trigger()实现的; |
AC::Action &action() | 返回运行时的action对象,action对象包含执行环境,这个执行环境用来执行被around advice封装的原始功能。 |