Bonjour,
est-ce possible de paramétrer le type d'un objet à partir de la valeur d'un String ? Je m'explique :
String type = "Valeur";
Valeur a = new Valeur();
Evidemment la classe Valeur aura été définie au préalable
Merci d'avance !!
Bonjour,
est-ce possible de paramétrer le type d'un objet à partir de la valeur d'un String ? Je m'explique :
String type = "Valeur";
Valeur a = new Valeur();
Evidemment la classe Valeur aura été définie au préalable
Merci d'avance !!
Class c = Class.forName(...) // Nom complet avec le package
et
c.newInstance() // nécessite un constructeur sans argument, sinon il faut chercher le bon constructeur dans la classe et l'appeler.
En effet ça marche !
Par contre je n'arrive pas à appeler les méthodes de la classe et ça je ne sais pas si c'est possible...
Tu pourrais le faire en utilisant c.getMethod() comme indiqué dans la FAQ sur la reflexivité en Java.
Mais en principe tu devrais pas avoir besoin de ça. Tu devrais plutôt faire un truc genre :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Class<?> c = Class.forName("ImplementationDeTonInterface"); TonInterface a = (TonInterface)c.newInstance(); a.taMethode();
Le mieux est de faire une Factory :
Car je suppose que tu n'as pas 36 valeurs pour ton String. Sinon, la méthode de Mathieu est pas mal.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 class ClassFactory{ public Object createInstanceOf(String className){ switch(className){ case 'String': return new String(); default : return null; } } }
Cordialement,
Patrick Kolodziejczyk.
Si une réponse vous a été utile pensez à![]()
Si vous avez eu la réponse à votre question, marquez votre discussion
Pensez aux FAQs et aux tutoriels et cours.
Appel qui ne soulève pas d'erreur.
Si un jour tu dois crée une instance "enfant" à la place de la classe appeler, tu pourra le gérer.
Mais, si la réalisation du Class.forName() se trouve dans une classe spécifique (Factory) et que celle-ci gère les exceptions potentiels. L'exemple est juste plus simple/simpliste.
Sinon pour connaitre les méthodes d'une classe :
http://docs.oracle.com/javase/7/docs...tMethods%28%29
Et dans la classe Method :
http://docs.oracle.com/javase/7/docs...g.Object...%29
Cordialement,
Patrick Kolodziejcyzk.
Si une réponse vous a été utile pensez à![]()
Si vous avez eu la réponse à votre question, marquez votre discussion
Pensez aux FAQs et aux tutoriels et cours.
Il y a des exceptions, car c'est une API. On t'informe que cela se passe mal. Après cela est à toi de voir quand et où tu traite cette erreur.? Pas compris... S'il y a des exceptions potentielles, elles sont là pour une raison. Et même si on veut les faire gérer par une factory, il n'y a pas de raison de s'embêter avec un switch en utilisant autre chose que Class.forName()...
Je propose juste une solution qui l'introduit pas de gestion d'erreur et qui limite le nombre de classe visé.
Pour le switch, c'est plus une vision personne du problème. Si tu veux un Objet de la classe Patate, mais que la classe Patate est abstrait, tu peux crée un Objet PatateDefault à la place.
C'est plus un choix entre générique/custome...
Si une réponse vous a été utile pensez à![]()
Si vous avez eu la réponse à votre question, marquez votre discussion
Pensez aux FAQs et aux tutoriels et cours.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager