signature.getName());
}
}
为了测试这段初步的日志记录代码,我将使用一个精巧的递归方法,它是斐波纳契数列计算的一个实 现,如清单 4 所示。
清单 4. 斐波纳契数列计算
package com.sosnoski.aspectwerkz;
public class FiboTest
{
private long fibo(int value) {
if (value > 2) {
return fibo(value-1) + fibo(value-2);
} else {
return 1;
}
}
public static void main(String[] args) {
FiboTest inst = new FiboTest();
int value = Integer.parseInt(args[0]);
System.out.println("Fibo[" + value + "] is " +
inst.fibo(value));
}
}
Classwo***ng工具箱: 将aspect放到werk中(4)
时间:2011-10-16 IBM Dennis Sosnoski
直接运行这段代码很简单:
[dms]$ java -cp classes com.sosnoski.aspectwerkz.FiboTest 6
Fibo[6] is 8
用 AspectWerkz 运行它要复杂一些。有两种用 AspectWerkz 实现 aspect 处理的方法: 编译时类修 改和运行时类修改。在本文中,我将使用运行时方法。这种方法需要一个作为 AspectWerkz 框架一部分 提供的客户类装载器。为 AspectWerkz 安装主目录建立一个环境变量,并假定 XML 配置(见 清单 2) 是在 aspectwerkz.xml 文件中,下面是使用 AspectWerkz 的 清单 4 的 Linux 和 UNIX 版本(命令行 加了换行以适合本文的宽度限制):
[dms]$ $ASPECTWERKZ_HOME/bin/aspectwerkz
-Daspectwerkz.definition.file=aspectwerkz.xml
-cp classes com.sosnoski.aspectwerkz.FiboTest 6
得到的输出也要长得多。在这里和在其他的例子中,我将忽略由 AspectWerkz 打印的启动信息,并显 示由我的 advice 生成的输出。输出如清单 5 所示:
清单 5. 修改后的计算结果
Entering method fibo
Entering method fibo
Entering method fibo
Entering method fibo
Entering method fibo
Leaving method fibo
Entering method fibo
Leaving method fibo
Leaving method fibo
Entering method fibo
Leaving method fibo
Leaving method fibo
Entering method fibo
Entering method fibo
Leaving method fibo
Entering method fibo
Leaving method fibo
Leaving method fibo
Leaving method fibo
Entering method fibo
Entering method fibo
Entering method fibo
Leaving method fibo
Entering method fibo
Leaving method fibo
Leaving method fibo
Entering method fibo
Leaving method fibo
Leaving method fibo
Leaving method fibo
Fibo[6] is 8
Classwo***ng工具箱: 将aspect放到werk中(5)
时间:2011-10-16 IBM Dennis Sosnoski
加以改进
清单 5 显示调用了 清单 3 中的 advice 方法, 但是没有提供关于所执行的应用程序的很多有用信 息。通过修改这个 advice 以缩进方式显示嵌套的方法调用,并且打印传递和返回的值,我将改进这一不 足。为此,我还要将这个 advice 改为另一种类型:around advice 类型。清单 6 显示了修改后的代码 。
清单 6. 带有缩进和值打印的 advice 方法
private int m_nestingDepth;
private void indent() {
for (int i = 0; i < m_nestingDepth; i++) {
System.out.print('' '');
}
}
private void printCall(JoinPoint call) {
MethodSignature signature =
(MethodSignature)call.g
|