2010-12-01 13 views
2

es ziemlich schwer zu erklären, aber ich möchte in AspectJ einen pointcut auf den Aufruf einer Funktion wie folgt definieren:definieren pointcut auf einem Mitgliedszugang und Funktionsaufruf

public class B{ 
    public A a; 
} 

public class A{ 
    public void foo(){...} 
} 

und die pointcut sollte abfangen die folgende rufen:

B.a.foo(); 

ich habe noch nicht den Weg gefunden, es zu tun (falls vorhanden). Hat jemand von euch eine Idee?

Vielen Dank im Voraus

Antwort

2

Ich bin selbst ein AspectJ-Neuling, aber ich habe das Gefühl, dass das nicht möglich ist. Selbst wenn Sie eine pointcut entwickelt, die B.a.foo() abgestimmt, dann würden Sie noch irgendwie müssen die folgenden Fall behandeln:

A a = b.a; 
a.foo(); 

oder sogar

public void fooA(A aToFoo) { aToFoo.foo(); } 

public void whatever(B someB) { fooA(someB.a); } 
0

Sie einen pointcut definieren kann, die jeden Hinweis auf den öffentlichen Bereich einfängt, aber AFAIK können Sie nicht erstellen, die auf der Referenz einen Feldverweis mit einem Methodenaufruf kombiniert.

+0

Ja, das ist, was ich auch dachte. Aber ich hoffte, dass jemand einen komplexen Ausdruck finden könnte, der es erreichen könnte – Jack

0

Wie andere schon erwähnt haben, ist dies in AspectJ nicht möglich. Es gibt jedoch einige Forschungserweiterungen von AspectJ, die Tracecuts einführen, eine neue Art von Pointcut, die in der Lage ist genau das zu tun, was Sie verlangen. Ich glaube nicht, dass es Implementierungen gibt, die produktionsbereit sind, aber Sie könnten daran interessiert sein, darüber zu lesen. Ein gutes Papier ist hier:

http://lsmr.cpsc.ucalgary.ca/papers/walker-fse-2004.pdf

Verwandte Themen