2014-09-16 1 views
0

Ma question est la suivante; veuillez aider.Traitement d'annotation d'exécution

J'ai une annotation applicable aux méthodes seulement que je veux être traité lors de l'exécution, par exemple

    @Target(ElementType.METHOD) 
        @Retention(RetentionPolicy.RUNTIME) 
        public @interface MyAnno { 
          String name();} 

Et voici mon processeur:

    public class MyAnnoProcessor(Class cls){ 
         Method[] m = cls.getClass().getMethods(); 
         ...// read the value passed to name and create an instance of an object depending on the value of 'name' 

Oui. MyAnnoProcessor code est le suivant:

   public class MyAnnoProcessor(Class cls){ 
       Method[] methods = cls.getMethods(); 
       for(Method m: methods){ 
        MyAnno an = (MyAnno) m.getAnnotation(MyAnno.class); 
        if(an!=null) 
         sysout(an.name()); 
         ....//call another method to create a class based on the value passed to 'name' 

Maintenant, j'ai une classe où je veux écrire de nombreuses méthodes annotées avec @MyAnno mais chaque méthode passe une valeur différente de « nom ». Suis juste incapable de trouver un moyen de gérer le traitement des annotations d'une manière idéale? Comment 'MyAnnoProcessor' devrait-il savoir quel (objet) doit être retourné à quelle méthode?

Dis, je le fais dans une méthode A:

   @MyAnno(name="testA") 
       public void A(){ 
        MyAnnoProcessor(this); 
       ...} 

Et encore une fois je le fais dans la méthode B:

    @MyAnno(name="testB") 
        public void B(){ 
        MyAnnoProcessor(this); 
        ...} 

Le 'MyAnnoProcessor' semble lire la valeur de 'nom' comme "testA" et non "testB" dans l'appel suivant de la méthode B. Où est-ce que je me trompe? S'il vous plaît donnez votre avis.

+0

Pouvez-vous coller tout le code pour le 'MyAnnoProcessor 'classe? Vous obtenez toutes les méthodes, mais à un moment donné, vous devriez distinguer entre 'A()' et 'B()' pour traiter les annotations correctement? – prabugp

+0

Vous devrez éditer votre question et coller le code. Je vois encore moins de code maintenant. – prabugp

+0

Oui, édité dans la question. Je ne sais pas comment distinguer si c'est A() ou B() l'appelant. – 5122014009

Répondre

0

Si vous souhaitez trouver des annotations pour une seule méthode, vous pouvez d'abord obtenir la méthode en utilisant la réflexion et la getDeclaredAnnotations(). Quelque chose comme

Class clazz = ...//obtain class object Method method = clazz.getMethod("A", null);

Sinon, avec votre code actuel, vous pouvez boucle encore à travers toutes les méthodes et faire une correspondance pour le nom de la méthode en faisant m.getName() dans votre boucle for pour savoir quelle méthode vous cherchez à maintenant.

PS: Je ne suis pas tout à fait sûr que votre code compilerait (MyAnnoProcessor, je ne vois pas de méthodes) et s'il vous plaît essayer de suivre les conventions de nommage pour les méthodes)

+0

Merci. Je veux un processeur d'annotation qui renvoie juste une instance d'un objet basé sur la valeur passée à 'name' sur la méthode annotée. C'est-à-dire, @MyAnno (name = "Personne") public void doSthWithperson() {// et l'instance Person devient disponible ici via le processeur d'annotation} ou @MyAnno (name = "Employee") public void doSthWithEmployee() {// et L'instance d'employé est rendue disponible par le processeur d'annotation}. Serait-ce possible sans passer explicitement la méthode annotée au processeur d'annotation? – 5122014009