2016-03-30 19 views
1

Also hier ist, was ich tun möchte: Ich möchte die Debit-Methode von der Konto-Klasse zu protokollieren, jedoch möchte ich sowohl die Menge (debit-Parameter) UND das getAccountNumber-Feld aus der Klasse protokollieren.AspectJ - Zugriff auf Klassenvariable/Methodenwerte aus Beratung?

bin ich Probleme, wie gehe ich über die Klasse field's Wert aus dem Aspekt

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

haben Sie die Lösung gefunden? – Purmarili

Antwort

1

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.

+0

Hallo, in meinem Fall brauche ich Instanz, Parameterwert und auch Feld von der Schnittstelle. Wie kann ich ein Feld von der Schnittstelle zu pointcut hinzufügen? – Purmarili