2011-06-28 2 views
6

Je souhaite créer un pointcut pour cibler un appel d'une méthode à partir de méthodes spécifiques.AspectJ pointcut à l'appel de méthode dans des méthodes spécifiques

prendre les éléments suivants:

class Parent { 
    public foo() { 
    //do something 
    } 
} 

class Child extends Parent { 
    public bar1() { 
    foo(); 
    } 
    public bar2() { 
    foo(); 
    } 
    public bar3() { 
    foo(); 
    } 
} 

Je voudrais avoir une coupe de point de l'appel à foo() dans les méthodes bar1() et bar3()

Je pensais quelque chose comme

pointcut fooOperation(): call(public void Parent.foo() && (execution(* Child.bar1()) || execution(* Child.bar3())); 

before() : fooOperation() { 
    //do something else 
} 

Cependant, cela ne semble pas fonctionner. des idées?

grâce

Répondre

2

Pensez ce que vous voulez est au lieu de faire les clauses d'exécution (qui ont l'inconvénient d'exiger des ajouts pour chaque nouvel appelant), est d'utiliser la cible, par exemple Quelque chose comme:

target(Child) && call(public void Parent.foo()). 

Assez étonnamment, j'ai trouvé les guides de pointcut dans la documentation d'éclipse très utiles. Ils sont here.

+0

Je dirais que celui-ci correspondrait aussi à l'appel à 'foo()' dans 'bar2()', contrairement à l'intention? – ShiDoiSi

+0

oui, cela attraperait 'foo()' dans 'bar2()', ce qui n'est pas ce qui est prévu – kabal

+0

Haha. Voici une recommandation: si vous voulez capturer foo() à partir de bar2..barn, utilisez mon point de coupe et ignorez l'appel à foo de bar1. Entrer et changer cette définition à chaque fois qu'une nouvelle barre est ajoutée n'est pas très utile. – Rob

3

Peut-être withincode fonctionnera:

call(public void Parent.foo()) && (withincode(* Child.bar1()) || withincode(* Child.bar3())); 

Sinon, vous pouvez essayer le cflow pointcut:

pointcut bar1(): call(* Child.bar1()); 
pointcut bar3(): call(* Child.bar3()); 

call(public void Parent.foo()) && (cflow(bar1()) || cflow(bar3()); 

Regardez ici pour un pointcut reference

Questions connexes