IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Autres Java Discussion :

[AspectJ] Accès à l'objet Method avec AspectJ


Sujet :

Autres Java

  1. #1
    Membre confirmé Avatar de Mobius
    Profil pro
    none
    Inscrit en
    Avril 2005
    Messages
    463
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : none

    Informations forums :
    Inscription : Avril 2005
    Messages : 463
    Points : 558
    Points
    558
    Par défaut [AspectJ] Accès à l'objet Method avec AspectJ
    Bonjour,

    J'utilise AspectJ pour créer des apsects.
    Dans l'un des aspects, je voudrais avoir accès à l'objet de type Method correspondant à la méthode sur laquelle s'applique l'aspect.

    Est ce que vous avez une idée ? Avez vous déjà fait ca ?

    Merci d'avance
    Librairie d'accès LDAP en Java : LdapBeans
    et pensez au tag

  2. #2
    Invité
    Invité(e)
    Par défaut
    Salut,

    Essaie de regarder du côté de thisJoinPoint : http://www.eclipse.org/aspectj/doc/r...JoinPoint.html et la méthode getSignature
    je pense que ça devrait t'aider .

    A plus

  3. #3
    Membre confirmé Avatar de Mobius
    Profil pro
    none
    Inscrit en
    Avril 2005
    Messages
    463
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : none

    Informations forums :
    Inscription : Avril 2005
    Messages : 463
    Points : 558
    Points
    558
    Par défaut
    Citation Envoyé par George7 Voir le message
    Essaie de regarder du côté de thisJoinPoint : http://www.eclipse.org/aspectj/doc/r...JoinPoint.html et la méthode getSignature
    C'est déjà fait
    Citation Envoyé par George7 Voir le message
    je pense que ça devrait t'aider .
    Justement non !
    La méthode getSignature donne un objet de type Signature et cet objet permet uniquement de récupérer le nom de la méthode et non pas l'objet de type Method.
    Du coup, on est obligé de chercher a la main la méthode ayant le bon nom.
    Plusieurs problème à cette solution :
    - C'est pas trivial à écrire (mais c'est pas le plus génant)
    - C'est encore moins trivial si plusieurs méthode ont le même nom avec des paramètres différents.
    - Ce n'est certainement pas ce qu'il y a de plus efficace.

    J'ai déjà implémenté cette solution (même si elle ne me satisfait pas complètement) mais j'ai peur que ca soit la seul solution. En attendant mieux je me contenterai de ça.

    Pour ceux que ca interesse voici le code permettant de recherche l'objet Method quand on a son nom (A noter que la vérification de la signature n'est pas satisfaisante ici):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
       private Method getMethod(Class<?> classe, String nomMethode, Object[] parametres)
       {
          Method resultat = null;
          Method[] methodes = null;
          Class<?>[] parameterTypes = null;
          Method methode = null;
          if (classe != null)
          {
             methodes = classe.getDeclaredMethods();
             // On recherche une méthode compatible dans la liste des méthodes de la classe
             for (int n = 0; (n < methodes.length) && (resultat == null); n++)
             {
                methode = methodes[n];
                // Est ce que la méthode a le meme nom et le meme nombre de parametres ?
                if ((methode.getName().equals(nomMethode)) && (parametres.length == methode.getParameterTypes().length))
                {
                   resultat = methode;
                   parameterTypes = methode.getParameterTypes();
                   // On vérifie que chaque paramètres à un type compatible avec ceux de la méthode
                   for (int i = 0; (i < parametres.length) && (resultat != null); i++)
                   {
                      if ((!parameterTypes[i].isPrimitive()) && (parametres[i] != null) && (!parameterTypes[i].isInstance(parametres[i])))
                      {
                         // Le type n'est pas compatible, ce n'est donc pas la bonne méthode
                         resultat = null;
                      }
                   }
                }
             }
             if (resultat == null)
             {
                // On n'a pas trouvé de méthode, on la cherche dans la classe parente
                resultat = getMethod(classe.getSuperclass(), nomMethode, parametres);
             }
          }
          return resultat;
       }
    Librairie d'accès LDAP en Java : LdapBeans
    et pensez au tag

  4. #4
    Invité
    Invité(e)
    Par défaut
    Hum...
    Etant donné que la liste des paramètres est retournée par la méthode getParameterTypes, tu ne devrais pas avoir de problème pour définir quelle méthode exactement est appelée, car c'est le compilo qui l'a déjà fait... Je pense donc qu'un simple getMethod avec le nom et la liste retournée devrait marcher, j'ai tenté avec ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    package test.aspectj;
     
    import java.lang.reflect.Method;
     
    import org.aspectj.lang.Signature;
    import org.aspectj.lang.reflect.MethodSignature;
     
    public aspect TestLog {
     
    	before(): call(* TestMain.*(..)) {
    		Signature sig = thisJoinPoint.getSignature();
    		if (sig instanceof MethodSignature) {
                            // en théorie le test es inutile, mais bon....
    			System.out.println("Method called: " + thisJoinPoint);
    			MethodSignature msig = (MethodSignature) sig;
    			Class<?> declType = msig.getDeclaringType();
    			String name = msig.getName();
    			Class<?>[] params = msig.getParameterTypes();
    			try {
    				Method meth = declType.getMethod(name, params);
    				System.out.println("Method found: " + meth);
    			} catch (Exception e) {
    				e.printStackTrace();
    				System.exit(1);
    			}
    		}
    	}
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    package test.aspectj;
     
    public class TestMain {
     
        public static void main(String[] args) {
    	TestMain tm = new TestMain();
    	tm.m1();
    	String s = "t";
    	Number n = new Integer(1);
    	Integer i = new Integer(2);
    	tm.m2(s, n);
    	tm.m2(s, i);
        }
     
        public void m1() {
     
        }
     
        public void m2(String s, Number n) {
     
        }
     
        public void m2(String s, Integer i) {
     
        }
     
    }
    Le résultat est :
    Method called: call(void test.aspectj.TestMain.m1())
    Method found: public void test.aspectj.TestMain.m1()
    Method called: call(void test.aspectj.TestMain.m2(String, Number))
    Method found: public void test.aspectj.TestMain.m2(java.lang.String,java.lang.Number)
    Method called: call(void test.aspectj.TestMain.m2(String, Integer))
    Method found: public void test.aspectj.TestMain.m2(java.lang.String,java.lang.Integer)

  5. #5
    Membre confirmé Avatar de Mobius
    Profil pro
    none
    Inscrit en
    Avril 2005
    Messages
    463
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : none

    Informations forums :
    Inscription : Avril 2005
    Messages : 463
    Points : 558
    Points
    558
    Par défaut
    Je n'avais pas connaissance de l'interface MethodeSignature

    Du coup, j'ai fait un peu compliqué pour pas grand chose...

    Avec cette interface, j'ai directement accès à getMethod() qui me donne directement ce que je veux.

    Merci beaucoup.
    Librairie d'accès LDAP en Java : LdapBeans
    et pensez au tag

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 23/03/2012, 15h41
  2. [AspectJ] Programmation par aspect (AOP) avec AspectJ
    Par Bassemca dans le forum Autres
    Réponses: 1
    Dernier message: 19/12/2009, 12h50
  3. Accès aux objets COM avec Visual C++
    Par gzeus dans le forum VC++ .NET
    Réponses: 2
    Dernier message: 21/09/2008, 03h59
  4. [Framework] Spring AOP avec @AspectJ
    Par zooba dans le forum Spring
    Réponses: 1
    Dernier message: 27/03/2008, 17h06
  5. pb d'invoke de methode avec un tableau d'objets en parametre
    Par sebastien2222 dans le forum Collection et Stream
    Réponses: 11
    Dernier message: 27/09/2006, 10h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo