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éation d'un objet à partir du nom d'une classe


Sujet :

Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 26
    Points : 14
    Points
    14
    Par défaut Création d'un objet à partir du nom d'une classe
    Bonjour à tous,
    Voilà je cherche depuis hier à créer un objet depuis le nom d'une classe. En cherchant sur le forum j'ai avancé un peu en utilisant
    Class.forName("") mais le problème c'est que lorsque je fais une nouvelle instance de de la classe que j'obtiens avec ce Class.forName("") je n'ai pas accès aux méthodes de ma dite classe...
    Je vous montre le bout de code que j'ai fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    strClassPackage = "testrelease.testreleasefct.testreleasefctppi.TestReleaseFctTC1";
    Class classTestCase = Class.forName(strClassPackage);
    Object Test = classTestCase.newInstance();
    En gros ensuite lorsque que je fais Test. je n'ai pas les méthodes que j'ai dans la classe TestReleaseFctTC1 (ces méthodes sont déclarées en public).

    Je vous remercie d'avance pour votre aide...
    bilowlex

  2. #2
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Points : 12 977
    Points
    12 977
    Par défaut
    Ben c'est normal, test est de type java.lang.Object. Faudrait peut-être caster :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TestReleaseFctTC1 test = (TestReleaseFctTC1)classTestCase.newInstance();

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    Tout d'abord merci pour ta réponse
    En fait j'ai déjà essayé de faire ça mais le problème c'est que ce n'est pas toujours TestReleaseFctTC1, ça peut être TestReleaseFctTC2 ...
    En gros c'est le strClassPackage qui n'est pas toujours le même (dans l'exemple j'ai mis un cas particulier pour plus de facilité) et du coup je vois pas comment faire...

  4. #4
    Membre éprouvé Avatar de Gardyen
    Homme Profil pro
    Bio informaticien
    Inscrit en
    Août 2005
    Messages
    637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bio informaticien

    Informations forums :
    Inscription : Août 2005
    Messages : 637
    Points : 1 050
    Points
    1 050
    Par défaut
    dans ce cas la il te faudra te tourner vers la réflexion

    jettes un coup d'œil à l'API java.lang.reflect

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    Ok merci je vais regarder et je vous tiens au courant

  6. #6
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Quel est l'objectif de tout cela précisément ?

    a++

  7. #7
    Invité
    Invité(e)
    Par défaut
    Si tu connais déjà le nom des différentes classes qui peuvent-êtres chargées et qu'elles ne sont pas trop nombreuses (d'ou l'utilité de la question d'adiguba) tu peux tjs faire une série d' instanceof..

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    Le but est en fait de lancer une série de tests qu'on a séléctionnés au préalable parmi une liste qui se crée dynamiquement (chaque test correspond à une classe).
    Je ne veux pas avoir à rentrer le nom de mes classes à la main car le but est justement que tout ce fasse dynamiquement lorsque l'on créer un nouveau test (nouvelle classe)

  9. #9
    Invité
    Invité(e)
    Par défaut
    Si toutes tes "nouvelles" classes ont un même objcetif, elles sont surement quelques points communs.. Pourquoi ne pas utiliser une interface ?
    Comme celà tu n'a pas à te soucier du nom complet de la classen tu travaille sur l'interface..

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    En fait ces classes peuvent être dans un autre package et le seul point commun entre toutes ces classes est qu'elles ont une méthode StartTestFunction(), ça peut quand même fonctionner avec une interface?

  11. #11
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Oui Justement !

    Tu te fais une interface qui définit cette méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public interface StartTestInterface {
    	public void StartTestFunction();
    }
    Ensuite tous tes tests devront implémenter cette interface :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class MonText implements StartTestInterface {
    	public void StartTestFunction() {
    		// CODE
    	}
    }

    Ensuite il suffit de caster tes tests vers l'interface pour l'utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	strClassPackage = "testrelease.testreleasefct.testreleasefctppi.TestReleaseFctTC1";
     
    	Class classTestCase = Class.forName(strClassPackage);
    	// On vérifie que le type 'classTestCase' implémente bien l'interface :
    	if (StartTestInterface.class.isAssignableFrom(classTestCase)) {
    		// On crée une nouvelle instance que l'on caste vers l'interface :
    		StartTestInterface test = (StartTestInterface) classTestCase.newInstance();
    		// Et on appelle la méthode :
    		test.StartTestFunction();
    	}
    a++

    PS : je te conseillerai de respecter les conventions de nommage (pas de majuscule pour les méthodes ou variables )

  12. #12
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par bilowlex Voir le message
    En fait ces classes peuvent être dans un autre package et le seul point commun entre toutes ces classes est qu'elles ont une méthode StartTestFunction(), ça peut quand même fonctionner avec une interface?
    Ben oui :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public interface Test {
      public boolean StartTestFunction();
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public class UneClasseDeTest implements Test {
      public boolean StartTestFunction() {
        // Code
        return true ou false;
      }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public class Core {
      public void uneMethode(String classAExecuter) {
         Test test = (Test) Class.forName(classAExecuter).newInstance();
         if ( test.StartTestFonction() ) {
           // ...
         } else {
           // ...
         }
      }
    }
    Note : ce sont des méthodes et pas des Fonctions. Une méthode commence toujours pas une minuscule -> startTestFonction()

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    Merci à tous les deux je vais essayer ça.
    Je sais pour les majuscules mais mon chef de projet m'impose des majuscules au début de chaque méthode...

  14. #14
    Membre averti
    Inscrit en
    Juin 2003
    Messages
    292
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 292
    Points : 317
    Points
    317
    Par défaut
    La solution de l'interface c est bien si tu as access a tes testcode et qu ils peuvent implementer cette fonction.
    et tu ne peux pas just utiliser Reflection pour call ta method?
    regarde vers java.lang.reflect.Method
    On fait du testing base sur la reflection aussi, et c pas la joie quand tu ne peux pas toucher au code des classes que tu teste.

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par jhaythem Voir le message
    et tu ne peux pas just utiliser Reflection pour call ta method?
    regarde vers java.lang.reflect.Method
    C'est ce que je suis en train de regarder

  16. #16
    Membre averti
    Inscrit en
    Juin 2003
    Messages
    292
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 292
    Points : 317
    Points
    317
    Par défaut
    On utilise ca pour tester les BlackBerry devices.

    tu peux m envoyer des MP si tu as besoin d aide sur testing & reflexion, je serais interesse de voir comment d autre company approach ca.

    Cheers,

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    J'ai fini par faire la solution avec java.lang.reflect.
    Voilà mon code si ça interesse quelqu'un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    String strTestCaseClass =	"package.packagetruc.nomdelaclasse";
    Class classTestCase 	=	Class.forName(strTestCaseClass);
    Object objTestCase	= 	classTestCase.newInstance();
    Class[] paramTypes	= 	new Class[]{}; // On donne les paramètres de la méthode si il y en a
    Method getDescription 	= 	objTestCase.getClass().getMethod("StartTestCase", paramTypes);
    Object objDescription 	=	getDescription.invoke(objTestCase, null);
    Boolean boolSuccesTestCase	=	(Boolean)objDescription;
    boolSuccesTestCase.booleanValue();// Pou récupérer l'état du boolean
    Merci à tous pour votre aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Créer un nouvel objet à partir du nom de la classe de l'objet
    Par gueuldange dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 13/04/2015, 22h37
  2. Réponses: 1
    Dernier message: 27/05/2008, 11h50
  3. Accès à un objet à partir du nom de son parent
    Par SPKlls dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 22/04/2008, 15h45
  4. création d'1 objet à partir d'1 String
    Par AnthonyL44 dans le forum Langage
    Réponses: 8
    Dernier message: 22/08/2006, 11h20
  5. [POO] Instancier un objet avec le nom de la classe
    Par shinchun dans le forum Langage
    Réponses: 4
    Dernier message: 08/06/2006, 14h44

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