所以这就是我想做的事情: 我想从Account类记录借记方法,但是,我想从类中记录金额(借方参数)和getAccountNumber字段。
我在如何从方面
中获取类字段的值方面遇到了麻烦public interface Account {
public int getAccountNumber();
public void debit(float amount) throws InsufficientBalanceException;
}
public aspect Log {
pointcut Logging() : call(* Account.debit());
before() : Logging(){
}
after() : Logging(){
}
}
答案 0 :(得分:1)
你有几个选择。对于目标日志记录,您可以绑定Account实例和参数值,并直接访问所需信息:
pointcut Logging(Account account, float amount): call(* Account.debit()) && args(amount) && target(account);
before(Account account, float amount): Logging(account, amount) {
System.out.println("Number="+account.getAccountNumber()+" Amount="+amount);
}
对于更一般的日志记录(如果您可能在调用切入点中通配了更多名称),可以使用thisJoinPoint
(它有点像'this',因为它是一个内置名称,您可以使用在建议块中):
pointcut Logging() : call(* Account.debit(..));
before() : Logging(){
System.out.println("Number="+((Account)thisJoinPoint.getTarget()).getAccountNumber();
// use getArgs() on thisJoinPoint to amount
}
thisJoinPoint
的计算成本比直接绑定更高。请注意,我也将切入点更改为debit(..)
,因为您的借记需要一个参数,您对debit()
的切入点元素将不匹配。此外,只是为了指出可能的改进,匹配'call'将检测潜在的许多地方(对方法的所有调用)。匹配方法的“执行”通常会匹配/编织更少的位置,因为它匹配调用的目的地,并且许多调用可能会转到相同的位置。如果在执行时匹配,则将上面target
绑定的使用更改为this
。