AspectJ - 从建议中访问类变量/方法值?

时间:2016-03-30 01:19:18

标签: java aop aspectj

所以这就是我想做的事情: 我想从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(){
    }
}

1 个答案:

答案 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