gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 07:29:59 25 4
gpt4 key购买 nike

所以这就是我想做的:我想记录 Account 类中的 debit 方法,但是,我想记录该类中的金额(debit 参数)和 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(){
}
}

最佳答案

您有几个选择。对于定向日志记录,您可以绑定(bind) 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”,因为它是一个内置名称,您可以在建议 block 中使用):

pointcut Logging() : call(* Account.debit(..)); 

before() : Logging(){
System.out.println("Number="+((Account)thisJoinPoint.getTarget()).getAccountNumber();
// use getArgs() on thisJoinPoint to amount
}

thisJoinPoint 的计算成本比直接绑定(bind)更高。请注意,我还将您的切入点更改为 debit(..),因为您的 debit 采用参数,您的 debit() 切入点元素将与该参数不匹配。另外,只是为了指出可能的改进,匹配“调用”将检测潜在的很多地方(对该方法的所有调用)。方法的“执行”匹配通常会匹配/编织更少的位置,因为它匹配调用的目的地,并且其中许多调用可能会前往同一位置。如果执行时匹配,则将上面的 target 绑定(bind)的使用更改为 this

关于java - AspectJ - 从建议中访问类变量/方法值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36297973/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com