图1:从形状程序的输入
如果我们想看见程序调用的真实顺序,我们有两个选择。第一种方法是,我们可以在每一个程序的开始插入编码,那样可以以程序和类的名字打印一个信息,并且事实上程序已经被输入。我们需要为每一个程序做上述的过程。第二种方法是,我们要创建一个方面来做完全一样的事情。用这种方法,我们不需要改变应用程序的任何编码。
跟踪实例包含使用方面跟踪解决方法的几个版本。我们来看最终的版本。其他版本的讨论请见AspectJ Programming Guide中的讨论。
一个稳固的跟踪机制的解决方法包含两个文件。第一个是一个抽象的方面。一个抽象的类的一些编码被留给了编程人员,编程人员使用它在一个导出的类中执行,或者在一个导出的方面中执行。这个抽象的方面,叫做Trace,有几种标准程序来打印关于输入和退出一个程序,或构造方法的信息以及格式化输出的结果。如果我们没有使用方面,这些程序将在一个帮助者类中,你可以用它来输出跟踪信息。Trace同时允许编程人员通过设置一个叫做TRACELEVEL的性质,来设置跟踪的类型。这里有三个级别:没有信息,没有缩进的信息,以及被缩进来表达被嵌套的调用的信息。
跟踪定义了三个切入点;其中的两个是具体的,一个是抽象的,正如图2所示。抽象的切入点是myClass,它必须通过可以扩展Trace的方面来提供。切入点的目的是为包含将被建议的连接点的对象选择类。这个让开发人员决定哪些类将被包括在跟踪输出结果中。
图2: 跟踪方面中的切入点
myConstructor切入点在任何构造方法的开始,它被myClass选择为类中的一个对象选择连接点。连接点是实际的主体。myMethod与myConstructor相似,但它在一个被选择的类中选择任何程序的执行。注释同样省略了toString程序的执行,因为它被用在了建议中。