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

Langage Java Discussion :

Type casting dynamique


Sujet :

Langage Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2009
    Messages : 5
    Par défaut Type casting dynamique
    Bonjour,

    Quelqu'un pourrait-il m'expliquer pourquoi la méthode suivante ne compile pas (cannot find symbol: class beanClass) ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    private void printBeanId(String className, Object obj) throws ClassNotFoundException {
        Class beanClass = Class.forName(className);
        beanClass bean = (beanClass) obj;
        System.out.println("Bean Id: " + bean.getId());
    }
    Cette méthode est juste un exemple, mais j'aimerais utiliser ce principe (classe dynamique) afin de supprimer du code à double (ou la seule chose qui change est le type de mes objets) et j'aimerais faire cela sans interface...

    Merci d'avance pour vos réponses

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    333
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 333
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    beanClass bean = (beanClass) obj;
    Le compilo ne connait pas cette classe : beanClass

    Tu ne peux pas travailler au niveau dynamique ET demander au compilateur de connaître ce que tu fais .... c'est dans deux phase différentes

    par exemple pour faire un cast tu dois :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    private void printBeanId(String className, Object obj) throws ClassNotFoundException {
        Class beanClass = Class.forName(className);
        if (beanClass.isInstance(obj)){
     /// tu as bien un objet de type className
    }
        System.out.println("Bean Id: " + bean.getId());
    }

    Bonne chance

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2009
    Messages : 5
    Par défaut
    Merci

    J'ai finalement réussi en utilisant getMethod() et invoke():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public void printBeanId(Object bean) throws Exception {
      System.out.println("Bean(" + bean.getClass().getName() + ") ID : " +
        bean.getClass().getMethod("getId", new Class[0]).invoke(bean, new Object[0]));
    }
    ce qui me permet d'utiliser la même méthode pour tous mes beans qui ont une méthode getId() sans implémenter d'interface:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    printBeanId(new Account());
    printBeanId(new Sales());
    printBeanId(new Channel());
    Et ca marche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Bean(beans.Account) ID : 1
    Bean(beans.Sales) ID : 1
    Bean(beans.Channel) ID : 1

  4. #4
    Invité
    Invité(e)
    Par défaut
    juste pour info :
    http://java.sun.com/javase/6/docs/ap...lang.Object%29
    je ne sais pas si ça aurait pu être utile ...

  5. #5
    Membre très actif
    Inscrit en
    Mars 2008
    Messages
    283
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 283
    Par défaut
    Une interface tuerais-t-il votre code ?
    Une simple "interface IndentifiedBean { int getId(); }" suffirais.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    333
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 333
    Par défaut
    Citation Envoyé par Grimly Voir le message
    Une interface tuerais-t-il votre code ?
    Une simple "interface IndentifiedBean { int getId(); }" suffirais.
    Je pense qu'il a pour instruction : " faut toucher le moins possible au code existant ... on a peur que ça explose de partout "

  7. #7
    Invité
    Invité(e)
    Par défaut
    c'est vrai que l'interface est ce qu'il y a de mieux dans ce cas,
    Mais si ce n'est pas possible, je pense qu'on peut combiner le isInstance() et Class.cast().
    Ca fait moins "bricolage" que le invoke (personellement).

  8. #8
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par PierreD87 Voir le message
    Mais si ce n'est pas possible, je pense qu'on peut combiner le isInstance() et Class.cast().
    Ca fait moins "bricolage" que le invoke (personellement).
    Sauf qu'en restant générique et sans type de base définissant une méthode getId() (interface ou classe), il est impossible d'appeler la méthode sans passer par la reflection et invoke()...


    a++

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2009
    Messages : 5
    Par défaut
    Je sais qu'avec des interfaces ça serait plus simple et plus "joli", mais comme les beans et les jpacontrollers sont générés par NetBeans d'après la base de données, j'ai pas trop envie de devoir les modifier (si la BDD est modifiée, je préfère regénérer le bean et le controller sans devoir remettre mes modifs).
    Pour les id, il suffirait effectivement d'implémenter une interface comme proposée par Grimly.
    Pour les jpacontrollers par contre, implémenter une interface ne suffit pas car les méthodes prennent le bean en question en paramètre et pas un Object, il faudrait alors modifier les méthodes du controller avec un paramètre Object et le typecaster dans le type du bean dans la méthode => modification du code généré par NetBeans...

    Voila actuellement le code auquel je suis arrivé:
    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
     
      private void deleteSelectedBean(List beans, JList list, Object jpaCtrl, String idConfirmMessageI18n, String idConfirmTitleI18n) {
        try {
          if (Tools.questionBox(idConfirmMessageI18n, idConfirmTitleI18n)) {
            Object del = beans.get(list.getSelectedIndex());
            jpaCtrl.getClass().getMethod("destroy", new Class[]{Long.class}).invoke(jpaCtrl, new Object[]{
              del.getClass().getMethod("getId", new Class[0]).invoke(del, new Object[0])
            });
            beans.remove(del);
            list.setSelectedIndex(beans.size()-1);
            list.ensureIndexIsVisible(list.getSelectedIndex());
          }
        } catch (Exception ex) {
          System.err.println("Exception: " + ex.toString());
        }
      }
     
      private void btnDelAccountActionPerformed(java.awt.event.ActionEvent evt) {                                              
        deleteSelectedBean(accountList, lstAccounts, JPA.ctrlAccount, "messageDeleteAccount.message", "messageDeleteAccount.title");
      }                                             
     
      private void btnDelSalesTeamActionPerformed(java.awt.event.ActionEvent evt) {                                                
        deleteSelectedBean(salesList, lstSalesTeam, JPA.ctrlSales, "messageDeleteSalesTeam.message", "messageDeleteSalesTeam.title");
      }                                               
     
      private void btnDelChannelActionPerformed(java.awt.event.ActionEvent evt) {                                              
        deleteSelectedBean(channelList, lstChannels, JPA.ctrlChannel, "messageDeleteChannel.message", "messageDeleteChannel.title");
      }
    Sachant que j'ai encore une quinzaine de beans à mettre, ca m'évite d'avoir du code à double pour tous ces beans...

    Après si quelqu'un a une meilleure idée sans modifier les beans et les controllers, je suis preneur

    Merci

Discussions similaires

  1. type SET dynamique ?
    Par pc.bertineau dans le forum Requêtes
    Réponses: 4
    Dernier message: 28/02/2007, 17h28
  2. Réponses: 1
    Dernier message: 30/05/2006, 23h34
  3. Cast dynamique d'un objet ?
    Par elitost dans le forum Langage
    Réponses: 2
    Dernier message: 02/05/2006, 10h43
  4. [DP][héritage]sous-casting dynamique
    Par Le prophete dans le forum Général Java
    Réponses: 4
    Dernier message: 20/08/2004, 11h56
  5. [VB6] creation de variable de type string dynamiquement
    Par da40 dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 12/06/2003, 16h59

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