2011-09-20 3 views
0

Je suis en train de faire un conseil autour d'une méthode qui étend une interface qui ressemble à ceci:Conseils autour de la méthode mise en œuvre d'une interface étendue

public interface StructureService { 
    void delete(FileEntry entry); 
} 

public interface FileService extends StructureService { 
    void dummy(); 
} 

Les classes qui mettent en œuvre ces regards comme ce qui suit:

public class DbStructureService implements StructureService { 
    public void delete(FileEntry entry) { 
    } 
} 
public class DbFileService extends DbStructureService implements FileService { 
    public void dummy() { 
    } 
} 

J'essaie de faire correspondre la méthode delete, mais seulement pour les classes implémentant FileService.

J'ai défini l'aspect suivant:

public aspect FileServiceEventDispatcherAspect { 
    pointcut isFileService() : within(org.service.FileService+); 

    pointcut delete(FileEntry entry) : 
     execution(void org.service.StructureService.delete(..)) 
     && args(entry) && isFileService(); 

    void around(FileEntry entry) : delete(entry) { 
      proceed(entry); 
    } 
} 

Le problème est que tant que j'ai pointcut de isFileService a permis à cette correspondra pas de cours; même si il ya beaucoup de méthodes qui devraient correspondre à cela

Si je remplace le dans within(org.service.FileService+) à within(org.service.StructureService+) il fonctionne également bien.

J'ai essayé d'expérimenter avec ceci() et ainsi de suite mais sans succès. Comment est-ce que je fais ça à aspectj?

EDIT: Mise à jour de l'apparence des classes qui implémente les interfaces. Je pense que ce scénario peut être difficile à conseiller puisqu'il n'y a pas de méthode surchargée dans DbFileService

+0

J'utilise le temps de compilation binaire tissage si cela – jontro

+0

Pour le code source de compilation, ce code est correct. Peut être le problème est en "binaire", bien qu'il ne devrait pas y avoir. – alehro

+0

Oui, j'ai édité ma question. Pensez-vous que c'est un scénario qui n'est pas supporté par aspectj? – jontro

Répondre

1

Je suppose que vous voulez dire que DbFileService implémente FileService mais pas StructureService. Étant donné que, ce code devrait fonctionner:

public aspect FileServiceEventDispatcherAspect {  

pointcut delete(FileService this_, FileEntry entry) : 
    execution(void org.service.StructureService.delete(..)) 
    && args(entry) && this(this_); 

void around(FileService this_, FileEntry entry) : delete(this_, entry) { 
     proceed(this_, entry); 
} 
} 

Le « dans » pointcut ne convient pas ici parce qu'il est « structure lexicale basée pointcut » ("AspectJ in Action", second edition.)

+0

Merci, la raison pour laquelle je suis confus est qu'il semble y avoir une erreur dans l'eclipse AJDT. Les marqueurs montrent une correspondance pour toutes les signatures concernant le type de ceci. Cependant, lors de la compilation cela fonctionne. – jontro

+0

AJDT est très utile mais en même temps n'est pas très fiable. Il pourrait manquer des marqueurs là où des conseils existent réellement, donner des avertissements sur les «conseils qui n'ont pas été appliqués», etc. – alehro

Questions connexes