2010-07-15 9 views
1

Je souhaite effectuer des vérifications d'autorisation pour les objets de domaine. Cela inclut des vérifications si quelqu'un est autorisé à instancier un objet (en fonction de son type - cette vérification est effectuée en externe, donc pas besoin de résoudre ce problème).AfterAdvice pour tous les constructeurs de classes implémentant statiquement une interface

Tous nos objets de domaine mettre en œuvre une interface spécifique (directement ou indirectement)

Ce que je besoin est un conseil qui court après l'instanciation d'un objet de domaine et est capable d'utiliser l'instance créée (nécessaire pour la détermination de la permission). (De plus, le conseil ne peut pas exécuter lorsque le constructeur est appelé de mise en veille prolongée)

Je veux mettre en œuvre ce en utilisant AspectJ (qui travaille encore pour les méthodes) de préférence en utilisant uniquement l'analyse statique, car il n'y a pas de changements à charge de l'exécution

Maintenant, j'essaie de créer une adresse @AfterReturning qui intercepte les appels du constructeur. Mais je ne travaille pas le pointcut.

Ce que j'essayé:

@Pointcut("within(a.b.c.DomainObject+) && execution(*.new(..))") 

@Pointcut("execution(a.b.c.DomainObject+.new(..))") 

Mais les deux ne fonctionne pas.

Est-ce que quelqu'un sait comment je peux y parvenir?

Cordialement Michael

Répondre

0

Voici quelques exemples qui m'a aidé à comprendre comment faire quelque chose de similaire. http://www.eclipse.org/aspectj/sample-code.html

Aussi, voici quelque chose que j'ai dans mon projet - à des fins de test - pour ajouter un écouteur après un objet est créé:

pointcut init(JComponent j): 
    this(j) && 
    initialization(*.new()); 

after(JComponent j) returning: init(j) { 
    if(j instanceof JButton && !(j instanceof AccessibleButton)) 
     System.out.println(j.toString() + thisJoinPointStaticPart.getSourceLocation()); 
    j.addFocusListener(new VisualFocusListener()); 
} 

EDIT:

ci-dessus s'exécutera chaque fois qu'un constructeur est appelé, que ce soit celui appelé ou appelé par this() ou super() - probablement pas ce que vous voulez. Je viens de trouver une autre façon d'obtenir l'objet renvoyé par le constructeur.

after() returning(JComponent j): call(*.new(..)) { 
    //do something with j 
} 

qui se lit en anglais presque comme il le fait dans le code: « après le retour d'un JComponent d'un constructeur, faire quelque chose ». J'ai *.new(..) parce que je ne m'inquiète pas quel constructeur est appelé ou quels paramètres il prend tant qu'il me donne un composant JComponent. Vous pouvez en outre limiter cela en disant Foo.new(..) ou Foo.new(int).