2016-07-21 7 views
0

Was ich suche, ist eine Möglichkeit, einen Punkt um eine Variable auf Klassenebene anzugeben. Etwas wie:Ist es möglich, einen AspectJ-Punkt um eine Variable auf Klassenebene zu erstellen?

@Target(ElementType.METHOD) 
@Retention(RetentionPolicy.FIELD) 
@interface MyPointCut 
{ 
} 

public class Foo 
{ 

    @MyPointCut 
    BarAPI api = new BarAPI(); 

} 

@Aspect 
public class MyAspect 
{ 
    @Around(value="execution(* *(..)) && @annotation(MyPointCut)") 
    public Object doSomethingBeforeAndAfterEachMethodCall() 
    { 
     ... 
    } 
} 

würde ich dann gerne einen Aspekt haben, die einige Arbeit vor und nach jedem Methodenaufruf des api Feld führt. Ist das machbar? Können Sie mir bitte eine Dokumentation zeigen, in der ich lesen kann, wie es geht?

+0

I don Weiß nicht wie über Feld, aber Sie können Getter hinzufügen und Aspekt um es hinzufügen –

+0

Das funktioniert nicht für mich. Was ich erreichen möchte, ist eine Möglichkeit, Code um jeden Aufruf der Methoden dieses Feldes herum auszuführen. Ich weiß nur nicht, ob aspectJ so etwas unterstützt – mdzh

Antwort

2

Es ist ein bisschen wie einfach Ausführungshinweise zu allen Methoden im Typ BarAPI, aber Ihr Unterschied ist, dass Sie nur eine bestimmte Instanz von BarAPI und nicht alle von ihnen interessiert.

// Execution of any BarAPI method running in the control flow of a Foo method 
Object around(): execution(* BarAPI.*(..)) && cflow(within(Foo)) {...} 

cflow ist ein bisschen 'schwer' für diese aber können wir etwas tun, leichter:

// Call to any BarAPI method from the type Foo 
Object around(): call(* BarAPI.*(..)) && within(Foo) { ... } 

Und was ist so etwas aber allgemeiner anwendbar:

// Assume Foo has an annotation on it so it is more general than type Foo. 
@HasInterestingBarAPIField 
public class Foo { ... } 

Object around(): call(* BarAPI.*(..)) && @within(HasInterestingBarAPIField) { ... } 
Verwandte Themen