Création "dynamique" d'annotation

Liverion Messages postés 296 Date d'inscription mardi 22 avril 2008 Statut Membre Dernière intervention 18 août 2008 - 13 juin 2008 à 10:27
Liverion Messages postés 296 Date d'inscription mardi 22 avril 2008 Statut Membre Dernière intervention 18 août 2008 - 16 juin 2008 à 10:18
Bonjour à tous , je me pose une petite question a propos d'un programme que je concois actuellement, et dans lequel j'utilise des annotations.

Voici mon programme :
Une classe pour definir mon annotation :

        package annotationTest;

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

        //pour pouvoir accéder à l'annotation lors de l'execution
        @Retention(RetentionPolicy.RUNTIME)
        public @interfaceMyAnnotation
        {
   
            double minimum();

            double maximum();

            double increment();

            //chaîne representant l'unité
            String unit();
   
            //commentaire non obligatoire
            String comment() default "";
   
        }

Une classe pour definir mes données et utilisant l'annotation :

        package annotationTest;

        public class Plot
        {

            //premiere variable
            @MyAnnotation(minimum=0 , maximum=4294967295.0 ,unit="s",increment=1.0)
            int SystemZeit1;

            //deuxieme variable
            @MyAnnotation(minimum=0.0,increment=1.0,unit="s",maximum=4294967295.0)
            int SystemZeit2;

            //troisieme variable
            @MyAnnotation(minimum=0.0,maximum=4294967295.0,increment=1,unit="id",comment="Eindeutige Plotnummer")
            int PlotID;

        }

Et enfin le main :

        package annotationTest;
        import java.lang.annotation.Annotation;
        import java.lang.reflect.*;

        public class Main
        {

            /**
             * @param args
             */
            public static void main(String[] args)
            {   
                // nouveau plot
                annotationTest.Plot p= new annotationTest.Plot();
       
                System.out.println("List von Plot Klasse Annotation");
                System.out.println();
       
                // pour chaque variable de Plot
                for(Field m : p.getClass().getDeclaredFields())
                {
                        // afficher le nom de la variable
                        System.out.println("\t  "+m.getName());
                        try{
                            // recuperer l'annotation du type MyAnnotation sur cette variable
                            Annotation a = m.getAnnotation(MyAnnotation.class);
                            // Pour chaque methode de cette annotation
                            for(Method param : a.annotationType().getDeclaredMethods() )
                            {
                                // afficher le type de retour, le nom de la methode et sa valeur après execution
                                System.out.println("\t\t  "+param.getReturnType().getSimpleName()+"     "+param.getName()+" "+param.invoke(a));                       
                            }
                            System.out.println();
                       
                            }catch(java.lang.Exception ex){System.out.println(ex.fillInStackTrace());}
                }

            }
        }

Ma question est la suivante : dans mon annotation, je declare un maximum en double par exemple, mais il s'applique sur une variable de type int. Existerait-il un moyen de detecter le type de la variable sur lequel s'applique l'annotation et d'utiliser ce type pour maximum, minimum et increment ? Si cela n'existe pas je pense me tourner vers la solution de créer une annotation pour chaque type de variable (int, double ...) mais ca m'interesse beaucoup de savoir si c'est eventuellement possible ^^
( Et sinon pas besoin de commentaires du type "Pourquoi passer par des annotations, ca serait plus simple de telle maniere ...", je n'ai pas choix  )

Merci beaucoup

~~
Les trois lois de Codes-Sources :
Loi 1) Tu lis et respectes le reglement
Loi 2) Tu penses à valider si une reponse apportée à ton problème t'a aidé
Loi 3) Si tu ne respectes pas les 2 premières ....TU SORS !!

9 réponses

dvoraky Messages postés 744 Date d'inscription dimanche 1 avril 2007 Statut Membre Dernière intervention 9 mai 2010 8
13 juin 2008 à 11:18
Salut Liverion,

Je sais pas si j'ai bien compris ce que tu veux faire.
En fait tu veux tester le type de ta variable, c'est ça?

il existe un truc comme ça

int variable = 0;

if (variable istanceof int) {
    System.out.println("coucou!!!");
}

Je sais pas si ça répond à ta question...

Timmy!!!
0
Liverion Messages postés 296 Date d'inscription mardi 22 avril 2008 Statut Membre Dernière intervention 18 août 2008
13 juin 2008 à 11:21
En fait c'est un peu compliqué, dans la declaration de mon plot j'utilise une annotation, et je voudrais que dans la declaration de cette annotation soit pris en compte le type de la variable de plot a laquelle elle est affectée.
Sachant qu'en plus une annotation est une interface, donc on ne peut pas implementer de code dedans ...

~~
Les trois lois de Codes-Sources :
Loi 1) Tu lis et respectes le reglement
Loi 2) Tu penses à valider si une reponse apportée à ton problème t'a aidé
Loi 3) Si tu ne respectes pas les 2 premières ....TU SORS !!
0
dvoraky Messages postés 744 Date d'inscription dimanche 1 avril 2007 Statut Membre Dernière intervention 9 mai 2010 8
13 juin 2008 à 11:50
En clair, une annotation peut etre de ce type, de celui-là ou de celui-là, c'est ça?

Et le instanceof ne résoudrait pas ton problème?

Timmy!!!
0
Liverion Messages postés 296 Date d'inscription mardi 22 avril 2008 Statut Membre Dernière intervention 18 août 2008
13 juin 2008 à 11:52
En fait j'aimerais que le type de retour de certaines methodes de mon annotation change suivant l'objet annoté.

~~
Les trois lois de Codes-Sources :
Loi 1) Tu lis et respectes le reglement
Loi 2) Tu penses à valider si une reponse apportée à ton problème t'a aidé
Loi 3) Si tu ne respectes pas les 2 premières ....TU SORS !!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
dvoraky Messages postés 744 Date d'inscription dimanche 1 avril 2007 Statut Membre Dernière intervention 9 mai 2010 8
13 juin 2008 à 11:53
Alors il te suffit de mettre en type de retour une interface et ensuite, tu retournes des objets qui implémentes cette interface

Timmy!!!
0
Liverion Messages postés 296 Date d'inscription mardi 22 avril 2008 Statut Membre Dernière intervention 18 août 2008
13 juin 2008 à 12:01
Je viens de regarder vie fait en essayant de mettre comme type de retour
java.lang.Number

ou

java.io.Serializable

et voici l'erreur :  "Invalid type Serializable for the annotation attribute MyAnnotation.minimum; only primitive type,
 String, Class, annotation, enumeration are permitted or 1-dimensional arrays thereof" qui provient du fait que les öethods d'une annotation n'ont le droit qu'à certains types de valeur retournée

~~~

Les trois lois de Codes-Sources :
Loi 1) Tu lis et respectes le reglement
Loi 2) Tu penses à valider si une reponse apportée à ton problème t'a aidé
Loi 3) Si tu ne respectes pas les 2 premières ....TU SORS !!
0
dvoraky Messages postés 744 Date d'inscription dimanche 1 avril 2007 Statut Membre Dernière intervention 9 mai 2010 8
13 juin 2008 à 13:22
Tu peux mettre Object comme type de retour... non je rigole hein.

Je vois pas trop comment on peut retourner Serializable...

Je sais pas trop quoi te dire là si ce n'est que retourner une interface serait, visiblement, le plus logique... enfin, ça dépasse mes compétences.

Désolé

Timmy!!!
0
Liverion Messages postés 296 Date d'inscription mardi 22 avril 2008 Statut Membre Dernière intervention 18 août 2008
13 juin 2008 à 13:28
Ok merci d'avoir essayé ^^ En fait j'avais déjà pensé à un type que les autres types possibles implementeraient (donc Number semblait bien) mais y'a trop de contrainte sur les annotations, faut que le type soit un type primitif, ou une enumeration de valeur de type primitif, ou un tableau de valeur de type primitif. Et sinon Serializable est une interface implémentée par tous, c'est pouquoi j'avais essayé de l'utiliser pour tester ;)

~~
Les trois lois de Codes-Sources :
Loi 1) Tu lis et respectes le reglement
Loi 2) Tu penses à valider si une reponse apportée à ton problème t'a aidé
Loi 3) Si tu ne respectes pas les 2 premières ....TU SORS !!
0
Liverion Messages postés 296 Date d'inscription mardi 22 avril 2008 Statut Membre Dernière intervention 18 août 2008
16 juin 2008 à 10:18
Ptite relance du sujet après le Week End, des fois que d'autres aient des idées  ^^

~~
Les trois lois de Codes-Sources :
Loi 1) Tu lis et respectes le reglement
Loi 2) Tu penses à valider si une reponse apportée à ton problème t'a aidé
Loi 3) Si tu ne respectes pas les 2 premières ....TU SORS !!
0
Rejoignez-nous