【发布时间】:2014-07-16 00:55:59
【问题描述】:
我听说过很多关于 AOP 如何帮助模块化日志记录等内容的好消息,但现在当我尝试实现这一点时,我发现 AspectJ 非常有限。
不仅有时不可能将日志记录添加到正确的行,而且访问局部变量值似乎非常困难。您必须确保该变量要么由方法返回,要么用作方法的参数。
日志记录超出被记录代码的范围这一简单事实是一个严重的限制。
是否有更好的方法来访问局部变量值以记录它们?
例如,我有一些维护计数器的代码,我想记录该计数器的值。原始代码如下所示:
int totalMoves = 0;
while(canMove()) {
// ...
totalMoves++;
}
Logger.log(totalMoves);
我找不到将这个日志记录代码移动到一个方面的干净 方法。根本无法按原样访问totalMoves。看来我的选择是:
- 将
totalMoves设为可公开访问的字段(反对信息隐藏和封装) - 创建一个只允许 AspectJ 的“挂钩”的虚拟函数(不比直接记录更好)
- 将
totalMoves设为私有字段,但使用反射来访问它(看起来代码味道很糟糕;创建了一个不必要的字段并使对变量的访问变得复杂)
说实话,我猜我在研究 AOP 时所期待的是逐字插入代码以消除横切问题。这些限制让我怀疑 AspectJ 在当前环境中是否值得使用。
这个问题有什么办法吗?还是我以错误的方式接近这个?在这种情况下,我怎样才能干净地记录局部变量?
TL;DR:用 AspectJ 记录局部变量值是一团糟,我怎样才能做得更好?
【问题讨论】: