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 :

créer une instance d'une classe à partir d'un attribut d'un tag personnalisé


Sujet :

Java

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2007
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 18
    Points : 11
    Points
    11
    Par défaut créer une instance d'une classe à partir d'un attribut d'un tag personnalisé
    salut,

    j'ai un taglib que j'ai crée pour un besoin spécifique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     <test:convert input="Person"/>
    le fichier tld étant bien défini, j'ai besoin de créer dans la classe qui fera le traitement du taglib , une instance de l'objet dont j'ai passé le nom comme valeur de input de mon taglib.
    du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Object obj = new "input"();

  2. #2
    Membre éclairé
    Homme Profil pro
    NoOb
    Inscrit en
    Mai 2007
    Messages
    554
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : NoOb

    Informations forums :
    Inscription : Mai 2007
    Messages : 554
    Points : 852
    Points
    852
    Par défaut
    Salut,

    Je ne sais pas comment faire, donc en attendant que qqn d'expérimenter te réponde je te propose un if else .

  3. #3
    Membre à l'essai
    Inscrit en
    Avril 2007
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    Salut,

    J'ai trouvé cette solution :

    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
    29
    30
    31
    32
    33
    34
    35
    36
     
    try
    	    	    {
    	    	      // Récupération de la classe java.awt.Button
    	    	      classe = Class.forName (input);
    	    	      // Récupération du constructeur prenant en paramètre une chaîne de caractères
    	    	      java.lang.reflect.Constructor constructeur = 
    	    	                     classe.getConstructor (new Class [] {Class.forName ("java.lang.String")});
    	    	      constructeur.newInstance (new Object [] {"nom", "prenom"});
    	    	    }
    	    	    catch (ClassNotFoundException e)
    	    	    {
    	    	      // La classe n'existe pas
    	    	    }
    	    	    catch (NoSuchMethodException e)
    	    	    {
    	    	      // La classe n'a pas le constructeur recherché
    	    	    }
    	    	    catch (InstantiationException e)
    	    	    {
    	    	      // La classe est abstract ou est une interface
    	    	    }
    	    	    catch (IllegalAccessException e)
    	    	    {
    	    	      // La classe n'est pas accessible
    	    	    }
    	    	    catch (java.lang.reflect.InvocationTargetException e)
    	    	    {
    	    	      // Exception déclenchée si le constructeur invoqué
    	    	      // a lui-même déclenché une exception
    	    	    }
    	    	    catch (IllegalArgumentException e)
    	    	    {
    	    	      // Mauvais type de paramètre
    	    	      // (Pas obligatoire d'intercepter IllegalArgumentException)
    	    	    }
    mais l'objet classe que je crée me retourne toujours la valeur null !!

  4. #4
    Membre éclairé Avatar de Heimdal
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 549
    Points : 718
    Points
    718
    Par défaut
    Salut,

    si tous tes objets potentiellement instanciables se trouvent dans le même package, tu peux faire un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Class<?> classForName = Class.forName("nom de package."+"input");
    Object obj = classForName.newInstance();

  5. #5
    Membre à l'essai
    Inscrit en
    Avril 2007
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    le résultat que j'obtiens est ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ma.gfi.model.Person@1a80a69

  6. #6
    Membre à l'essai
    Inscrit en
    Avril 2007
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    comment je peux exploiter l'instance retournée? accéder à ses attributs et méthodes?

  7. #7
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 075
    Points : 7 981
    Points
    7 981
    Par défaut
    Il faut le caster en ton type de classe a mon avis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TACLASSE obj = (TACLASSE)classForName.newInstance();
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Membre éclairé Avatar de Heimdal
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 549
    Points : 718
    Points
    718
    Par défaut
    En effet tu peux caster mais dans ce cas autant faire un if else ca reviendra au même te tu évites l'introspection.

    Pour faire ca sans if/else ou sans instanceof, repense ta conception.

    Est-ce que tous ces objets ont les mêmes méthodes? (dans ce cas utilise une interface et cast en cette dernière).
    Sinon un système d'enregistrement des différentes instances possibles et une factory pourrait le faire.
    Y a plein d'autres solutions encore, a toi de voir en fonction de tes besoins.

  9. #9
    Membre éclairé
    Homme Profil pro
    NoOb
    Inscrit en
    Mai 2007
    Messages
    554
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : NoOb

    Informations forums :
    Inscription : Mai 2007
    Messages : 554
    Points : 852
    Points
    852
    Par défaut
    Citation Envoyé par Génoce Voir le message
    Salut,

    Je ne sais pas comment faire, donc en attendant que qqn d'expérimenter te réponde je te propose un if else .
    Citation Envoyé par Heimdal
    En effet tu peux caster mais dans ce cas autant faire un if else ca reviendra au même te tu évites l'introspection.



Discussions similaires

  1. Utiliser une méthode d'une instance, dans une callback
    Par qdaemon_fr dans le forum Langage
    Réponses: 3
    Dernier message: 18/04/2014, 18h09
  2. [ATL] Utiliser une instance d'une règle dans une autre règle
    Par sacha33 dans le forum Eclipse Modeling
    Réponses: 0
    Dernier message: 02/06/2013, 23h41
  3. [XL-2007] Afficher une checkbox dans une feuille si une checkbox d'une autre feuille est cochée
    Par JessieCoutas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/08/2009, 13h35
  4. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48
  5. Réponses: 5
    Dernier message: 09/03/2007, 21h14

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