Posez votre question Signaler

Java API réflexion??? [Résolu]

amani - Dernière réponse le 20 déc. 2011 à 03:29
Bonjour,
j'ai crée une classe "TestClass"contentant 5 méthodes qui retourne chacune un String.
puis j'ai crée une annotation paramétrée avec paramètre nommé returnKey .
j'ai utilisé cette annotation pour quelques méthodes
Dans la classe main, et après avoir créer une instance de la classe "TestClass" via API reflexion il me faut CHERCHER les méthodes qui sont avec annotation et les INVOQUER via API reflexion..
Mon problème est: comment CHERCHER une méthode qui possède une annotation? et comment invoquer une telle méthode?via API reflexion?
voilà mon essai dans la classe main:
public class Main {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
try
{
Class clz = Class.forName("TestClass");//instancier la classe TestClass via API //reflexion
Object obj = clz.newInstance();
TestClass maC = ( TestClass ) obj;
for (Method m : maC.getMethods()) { //pour chaque méthode de la classe TestClass
for (Annotation ann : m.getAnnotations()) { // recherche des méthodes annoté //avec mon annotaion qui est appelée annoteMe
annoteMe an = (annoteMe) a;
String v = a.returnKey();
}
}
}
catch ( java.lang.Exception ex )
{
ex.printStackTrace( );
}
}
}
Lire la suite 

Java API réflexion »

22 réponses
Réponse
+1
moins plus
Sur le fond l'idée est la bonne, la mise en pratique est par contre à revoir.

import java.lang.reflect.Method;

public class Main 
{
    public static void main(String[] args) 
    { 
        for (Method m : TestClass.class.getMethods())
        {
            if (m.isAnnotationPresent(annoteMe.class))
            {
                annoteMe a = m.getAnnotation(annoteMe.class);
                String v = a.returnKey(); 
                System.out.println("\""+v+"\" in "+m.toGenericString());
            } 
        }
    }
}

Il y a également des problèmes de rétention de ton annotation et je ne sais pas si tu les as prises en compte ou pas, voici comment elle devrait être déclarée :

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

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

Enfin, voici un exemple, mais ce n'est pas le plus problématique ;-)

public class TestClass
{
    @annoteMe(returnKey="toto")
    public void toto()
    {
    }
    
    @annoteMe(returnKey="tata")
    public void tata()
    {
    }
}
Ajouter un commentaire
Réponse
+0
moins plus
Merci bcp :) oui j'ai fait la classe TestClass mais mon probléme juste en Classe main en fait voiçi la classe TestClass

public class TestClass {

public @interface annoteMe
{
String returnKey();
}

@annoteMe(returnKey="A")
public String A ()
{
return "A";
}
public String B ()
{
return "B";
}
@annoteMe(returnKey="C")
public String C ()
{
return "C";
}}
celà est juste?
KX- 20 déc. 2011 à 01:33
Je pense qu'il vaudrait mieux créer l'annotation dans un fichier un part, comme je l'ai faite tout à l'heure, cependant si tu tiens absolument à la mettre à l'intérieur de la classe TestClass il va falloir modifier quelques lignes dans le main, sans oublier de rajouter la rétention que j'ai mis mais pas toi :

public class TestClass
{
    @Retention(RetentionPolicy.RUNTIME)
    public @interface annoteMe
    {
        String returnKey();
    }
    
    @annoteMe(returnKey="A")
    public String A()
    {
        return "A";
    }
    
    public String B()
    {
        return "B";
    }
    
    @annoteMe(returnKey="C")
    public String C()
    {
        return "C";
    }
}

public class Main 
{
    public static void main(String[] args) 
    { 
        for (Method m : TestClass.class.getMethods())
        {
            if (m.isAnnotationPresent(TestClass.annoteMe.class))
            {
                TestClass.annoteMe a = m.getAnnotation(TestClass.annoteMe.class);
                String v = a.returnKey(); 
                System.out.println("\""+v+"\" in "+m.toGenericString());
            } 
        }
    }
}
Ajouter un commentaire
Réponse
+0
moins plus
une question svp j'arrive pas à comprendre à quoi sert cette ligne @Retention(RetentionPolicy.RUNTIME)
KX- 20 déc. 2011 à 01:54
Regarde la documentation de RetentionPolicy
amani - 20 déc. 2011 à 02:08
Grand merciiiiiiiiiiiiiiiiii !!!
Ajouter un commentaire
Réponse
+0
moins plus
je fais comme vous m'avez dite , aucune erreur mais lorsque je fais run rien n'apparais qu'une liste des exceptions !! :(
KX- 20 déc. 2011 à 02:24
Quelles exceptions ?
amani - 20 déc. 2011 à 02:28
voilà ma classe TestClass
package exercice;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

/**
*
* @author acer
*
*/

public class TestClass {

@Retention(RetentionPolicy.RUNTIME)

public @interface annoteMe
{
String returnKey();
}

@annoteMe(returnKey="A")
public String A ()
{
return "A";
}
public String B ()
{
return "B";
}
@annoteMe(returnKey="C")
public String C ()
{
return "C";
}
public String D ()
{
return "D";
}
@annoteMe(returnKey="E")
public String E ()
{
return "E";
}
}

****Voilà ma class main
package exercice;

import exercice.TestClass.annoteMe;
import java.lang.annotation.Annotation;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;

/**
*
* @author acer
*/
public class Main {

/**
* @param args the command line arguments
*/

public static void main(String[] args) {
try
{
Class clz = Class.forName("TestClass");

Object obj = clz.newInstance();
TestClass maC = ( TestClass ) obj;

HashMap hm = new HashMap();//istancier HashMap


for (Method m : TestClass.class.getMethods())
{
if (m.isAnnotationPresent(TestClass.annoteMe.class))
{
TestClass.annoteMe a = m.getAnnotation(TestClass.annoteMe.class);
String v = a.returnKey();
//System.out.println("\""+v+"\" in "+m.toGenericString());
hm.get(v);//enregister resultat via HashMap
}
}
}


catch ( java.lang.Exception ex )
{
ex.printStackTrace( );
}

}

}




pas d'erreur mais rien comme résultat!!! prk?
KX- 20 déc. 2011 à 02:33
Enlèves les commentaires au System.out.println tu verras que ça marche
Le problème vient de ta hashMap, pour la remplir il faut utiliser put et non get.

Remarque :
Les trois premières lignes de ton main (clz, obj, maC) ne servent à rien, et tu peux enlever try/catch
Ajouter un commentaire
Réponse
+0
moins plus
mais les 3 premières lignes sont faite pour créer une instance de la classe TestClass via API reflexion c'est l'énoncé de l'exercice qui a demandé ça !!
amani - 20 déc. 2011 à 03:21
mais la question et la suivante:
chercher les méthodes qui possèdent une annotation via API reflexion les invoquer ..ensuite enregistrer les valeur de retour de type String dans HashMap!! comment faire svp
KX- 20 déc. 2011 à 03:24
ok... donc c'est là qu'intervient newInstance...

public class Main
{
    public static void main(String...args) throws Exception
    {
        HashMap<String,String> hm = new HashMap<String,String>();
        
        for (Method m : TestClass.class.getMethods()) 
        { 
            if (m.isAnnotationPresent(TestClass.annoteMe.class)) 
            { 
                TestClass.annoteMe a = m.getAnnotation(TestClass.annoteMe.class); 
                String k = a.returnKey();
                String v = (String) m.invoke(TestClass.class.newInstance());
                hm.put(k,v);
            }
        }
        
        System.out.println(hm);
    }
}
amani - 20 déc. 2011 à 03:29
wéééy trop contente et trop satisfaite grand merciiii!! :)
Ajouter un commentaire
Ce document intitulé « Java API réflexion??? » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?