Sie bekommen haben ein paar Optionen. Für die gezielte Protokollierung können Sie den Account-Instanz und Parameterwert binden und Zugriff auf die Informationen, die Sie direkt benötigen:
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);
}
Weitere allgemeine Protokollierung (wenn Sie vielleicht wurden mehr Namen in Ihren Anruf pointcut Platzhaltern) könnten Sie thisJoinPoint
verwenden (es ist ein bisschen wie ‚dies‘, dass es sich um ein in Namen gebaut ist, dass Sie in einem Rat Block verwenden):
pointcut Logging() : call(* Account.debit(..));
before() : Logging(){
System.out.println("Number="+((Account)thisJoinPoint.getTarget()).getAccountNumber();
// use getArgs() on thisJoinPoint to amount
}
thisJoinPoint
teurer ist als eine direkte Bindung zu berechnen. Beachten Sie, dass ich auch Ihren Pointcut in debit(..)
geändert habe, da Ihre Last einen Parameter benötigt, das Pointcut-Element von debit()
wird nicht übereinstimmen. Um nur auf eine mögliche Verbesserung hinzuweisen, wird ein übereinstimmender "Aufruf" potentiell viele Orte (alle Aufrufe der Methode) instrumentieren. Die Übereinstimmung bei der "Ausführung" Ihrer Methode wird in der Regel zu weniger Orten passen/weben, da sie mit dem Ziel des Anrufs übereinstimmt und viele dieser Anrufe möglicherweise an denselben Ort gehen. Wenn der Abgleich bei der Ausführung erfolgt, ändern Sie die oben angegebene target
Bindung in this
.
haben Sie die Lösung gefunden? – Purmarili