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

Java Discussion :

Invoquer des getter de façon dynamique


Sujet :

Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 200
    Par défaut Invoquer des getter de façon dynamique
    Bonsoir la team,

    je ne sais pas si c'est possible alors après quelques recherches infructueuses, je sollicite votre aide.

    J'ai plusieurs classes dans mon application Java JEE, qui elle-même possèdent plusieurs méthodes.
    Je souhaiterais appeler une méthode d'une classe donnée de façon dynamique. Est-possible?

    Je vous soumet un exemple avec ce que j'ai pu trouver.

    J'ai une classe qui s'apelle "maClasse". Et à l'intérieur de cette classe une méthode s'appellant "getAttribut".

    Pour effectuer cela, est ce possible de faire ceci :

    1) Initialiser ma classe dynamique.
    2) Initialiser la méthode dynamique de ma classe.
    3) Appeler cette méthode dynamique pour récupérer le résultat.

    Code Java::

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class maClasse
    {
        String attribut;
     
        public String getAttribut() {
            return attribut;
        }
     
        //Note: les autres fonctions, comme le setter ne sont pas représentées.
    }
    Mes recherches ont donnée 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
    public class classeDeTest
    {
       // constructeur de classe
        public classeDeTest () {
     
                // 1) Initialiser ma classe dynamique.
              Class c = Class.forName("maClasse");
     
              // 2) Initialiser la méthode dynamique de ma classe.
              Method m = c.getMethod("getAttribut");
     
              // 3) Appeler cette méthode dynamique pour récupérer le résultat.
              Object monResultat =  m.invoke(c.newInstance(), null);
        }
     
    }
    Qu'en pensez-vous?

    Berni.

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 585
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 585
    Par défaut
    Citation Envoyé par bernidupont Voir le message
    Qu'en pensez-vous?
    Que c'est exactement ça.

    Évidemment, créer une nouvelle instance d'un objet juste pour appeler une méthode sans paramètre de cet objet tout de suite après, et ne rien en faire d'autre...
    Dis comme ça ça a pas l'air flamboyant d'intérêt. Une méthode statique serait plus attirante.

    Mais pour le cas général, ouais, c'est ça.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 200
    Par défaut
    une méthode statique c'est à dire?

    Je vous explique pourquoi je veux faire cela.
    J'ai un grand nombre d'élément contenu dans un message XML que je dois sauver en base. Il faut donc que je récupère leur valeur via leur getter.
    Du coup, si je peux factoriser le code, et utiliser une fonction comme cela, c'est beaucoup plus rapide.

    Qu'en pensez-vous?

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 585
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 585
    Par défaut
    Citation Envoyé par bernidupont Voir le message
    Qu'en pensez-vous?
    Que dans ce cas-là tu ne feras pas newInstance()

    Et puis, on peut se demander pourquoi des éléments XML ne sont pas tous de la même classe, permettant donc d'appeler toujours la même chose pour obtenir leurs attributs.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 200
    Par défaut
    - Je suis d'accord avec toi.
    Il faudrait que j'utilise la méthode dynamique généré sur l'instance de mon message XML.

    J'essayé de remplacer "new instance" par l'instance de mon message XML, mais j'obtiens l'erreur:
    "xmlModel.maClasse cannot be cast to org.omg.CORBA.Object".

    Est-ce possible ?


    - Les éléments XML ne sont pas dans la même classe car il y a des balises imbriquées.

    Ex:

    <balise1>
    <champs1> ...<champs1>
    <champs2> ...<champs2>
    ...
    <balise1>
    <balise2>
    <champs1> ...<champs1>
    <champs2> ...<champs2>
    ...
    <balise2>
    ...

    Du coup, l'application sur laquelle je travaille génère automatiquement les classes suivant chaque niveau:
    1- le niveau général permettant d'accéder à chaque balise;
    2 -le niveau en dessous permettant d'accéder au champs des balises.

  6. #6
    Membre Expert
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Par défaut
    Tu peux poster le code que tu utilises ?

    Un exemple qui marche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
          try
          {
             JPanel pan = new JPanel();
             Method m = pan.getClass().getMethod("toString");
             Object monResultat = m.invoke(pan);
             System.out.println(monResultat.toString());
          }
          catch (Exception ex)
          {
             ex.printStackTrace();
          }

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 200
    Par défaut
    je récupère ma classe xmlModel.MaClasse xml, si je fais :

    Object monResultat = (Object) m2.invoke(c., null); -> J'ai l'exception "xmlModel.MaClasse cannot be cast to org.omg.CORBA.Object"

    Object monResultat = (Object) m2.invoke(c.newInstance(), null); -> fonctionne mais mon instance est vide.

    Comment réutiliser l'instance en cours en utilisant invoke ?

  8. #8
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Pourquoi tu essaie de caster le résultat de invoke en un objet Corba?

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 200
    Par défaut
    Pour l'exception, je l'avais mal écrite:

    Object monResultat = (Object) m2.invoke(instanceDeMaClasse, null); -> J'ai l'exception "xmlModel.MaClasse cannot be cast to org.omg.CORBA.Object"

    La méthode invoke prend en argument un object , et d'autres objets en arguments. Dans mon cas, je lui donne mon instance et aucun arguments.
    Pourquoi cela fonctionne lorsque je fais c.newInstance() et non en lui donnant mon instance en cours?

  10. #10
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    le problème n'est pas ton instance, mais le cast que tu fais en sortie, il est là pourquoi? Pourquoi tu tente d'en faire un objet Corba?

  11. #11
    Membre Expert
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Par défaut
    Citation Envoyé par bernidupont Voir le message
    je récupère ma classe xmlModel.MaClasse xml, si je fais :

    Object monResultat = (Object) m2.invoke(c., null); -> J'ai l'exception "xmlModel.MaClasse cannot be cast to org.omg.CORBA.Object"

    Comment réutiliser l'instance en cours en utilisant invoke ?
    Comme dans mon exemple
    Le code qu'il faut montrer, c'est l'initialisation de la variable c (d'ou il sort?).

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 200
    Par défaut
    oui la classe "org.omg.CORBA.Object" définit dans l'import posait problème.
    Du coup, cela fonctionne parfaitement!
    Le seul problème pour cette méthode générique, c'est que je voudrais lui donner en paramètre une classe et le champs qui correspond au getter.
    Du coup, pour chaque classe il faudrait que je fasse une fonction à part...
    Confirmez-vous mon analyse?

  13. #13
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Si tu fais une fonction à part pour chaque classe, tu n'a plus besoin de faire de l'introspection, tu peux directement appeler la méthode puisque tu connais le type. L'introspection, ça sert quand tu ne connais pas la classe, mais que tu sais juste qu'elle aura une méthode X avec un paramètre Y d'un type précis.

Discussions similaires

  1. [XL-2007] Comment reformater des libellés de façon dynamique ?
    Par leinadjan dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/02/2013, 21h24
  2. Positionner des objets sur une image de façon dynamique
    Par derfez dans le forum Silverlight
    Réponses: 4
    Dernier message: 14/11/2011, 09h44
  3. Gestion des news de façon dynamique.
    Par Diyos dans le forum Langage
    Réponses: 2
    Dernier message: 25/05/2009, 19h25
  4. transférer des fichiers dans un autre dossier de façon dynamique
    Par soria_t dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 08/08/2008, 16h28
  5. [AJAX] affichage des données d'une façon dynamique
    Par copertino dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 22/03/2007, 22h19

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