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 :

probleme avec la classe class


Sujet :

Langage Java

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 72
    Points : 47
    Points
    47
    Par défaut probleme avec la classe class
    Bonjour,
    J'ai essayé d'executer un constructeur d'une classe dans la methode main d'une autre classe en utilisant la classe class et les notions de la reflexivité mais le probleme est lorsque je compile ma classe main j'ai pas d'erreur mais sans avoir de resultat..s'il vous plait aidez moi (sachant que je dois le faire en utilisant la classe "class" et ses methodes). voici les 2 classes que j'ai fait et merci d'avance pour l'aide:
    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    //****la premiere classe bonjour*********
    package pac;
     
    public class bonjour {
    	public  bonjour (String chaine )
    	{
    		System.out.println("bonjour");
    		System.out.println(chaine);
    	}
    }
     
     
    //******la classe main*****************
     
     
    package pac;
     
    public class principal {
    	public static void main(String[]args)
    	{String msg=" bon";
    		try
        {
            // Récupération de la classe bonjour
          Class classe = Class.forName ("pac.bonjour");
            // 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 ("pac.bonjour")});
          constructeur.newInstance (new Object [] {msg});
     
          }
          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)
          }
     
          }
     
    }

  2. #2
    Membre chevronné
    Avatar de Deadpool
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    1 312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 1 312
    Points : 2 011
    Points
    2 011
    Par défaut
    Hello!

    Heu, tu n'a rien mis dans tes clauses catch, forcément qu'il n'y aura pas d'erreur.
    Commence déjà par ajouter l'instruction suivante dans chacune des clauses catch.

    Ne jamais museler une Exception.

    -"Tout ça me paraît très mal organisé. Je veux déposer une réclamation. Je paye mes impôts, après tout!"
    -"JE SUIS LA MORT, PAS LES IMPÔTS! MOI, JE N'ARRIVE QU'UNE FOIS".

    Pieds d'argile (1996), Terry Pratchett 1948 - 2015
    (trad. Patrick Couton)

  3. #3
    Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 72
    Points : 47
    Points
    47
    Par défaut
    j'ai ajouté ces exceptions mais le probleme est toujours present...en plus maintenant il m'affiche no such exception methods

  4. #4
    Membre chevronné
    Avatar de Deadpool
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    1 312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 1 312
    Points : 2 011
    Points
    2 011
    Par défaut
    Peux-tu coller la stacktrace de l'exception s'il te plaît?

    -"Tout ça me paraît très mal organisé. Je veux déposer une réclamation. Je paye mes impôts, après tout!"
    -"JE SUIS LA MORT, PAS LES IMPÔTS! MOI, JE N'ARRIVE QU'UNE FOIS".

    Pieds d'argile (1996), Terry Pratchett 1948 - 2015
    (trad. Patrick Couton)

  5. #5
    Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 72
    Points : 47
    Points
    47
    Par défaut
    ben voila ce que je reçoie maintenant...


    java.lang.NoSuchMethodException: pac.bonjour.<init>(pac.bonjour)
    at java.lang.Class.getConstructor0(Unknown Source)
    at java.lang.Class.getConstructor(Unknown Source)
    at pac.principal.main(principal.java:11)

  6. #6
    Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 72
    Points : 47
    Points
    47
    Par défaut
    voici le message que je reçoie:

    java.lang.NoSuchMethodException: pac.bonjour.<init>(pac.bonjour)
    at java.lang.Class.getConstructor0(Unknown Source)
    at java.lang.Class.getConstructor(Unknown Source)
    at pac.principal.main(principal.java:11)

  7. #7
    Membre chevronné
    Avatar de Deadpool
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    1 312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 1 312
    Points : 2 011
    Points
    2 011
    Par défaut
    Me revoilou!

    Alors, ton problème vient de cette ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    classe.getConstructor (new Class [] {Class.forName ("pac.bonjour")});
    En fait la méthode getConstructor de la classe Class permet de récupérer le constructeur d'une classe en passant en paramètre, non pas la classe dont on veut le constructeur mais la signature du constructeur que l'on veut.

    Pour être plus clair, tu as défini un constructeur dans ta classe bonjour prenant en paramètre un String, c'est donc le type String que tu dois passer en paramètre de la méthode getConstructor.

    Tu fais ça quoi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    java.lang.reflect.Constructor constructeur = classe
    					.getConstructor(new Class[] { String.class });
    J'ajouterai pour terminer qu'en Java il y a une convention qui dit que le nom des classe devrait en principe commencer par une majuscule (renomme bonjour en Bonjour et principal en Principal).

    PS : si mon explication n'est pas clair, n'hésite pas à me le dire.

    -"Tout ça me paraît très mal organisé. Je veux déposer une réclamation. Je paye mes impôts, après tout!"
    -"JE SUIS LA MORT, PAS LES IMPÔTS! MOI, JE N'ARRIVE QU'UNE FOIS".

    Pieds d'argile (1996), Terry Pratchett 1948 - 2015
    (trad. Patrick Couton)

  8. #8
    Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 72
    Points : 47
    Points
    47
    Par défaut
    merci beaucoup pour votre aide... le probleme etait celui de getConstructor

  9. #9
    Membre chevronné
    Avatar de Deadpool
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    1 312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 1 312
    Points : 2 011
    Points
    2 011
    Par défaut
    Si c'est résolu, peux-tu cliquer sur s'il te plait?

    A moins que tu n'aies d'autres questions?

    -"Tout ça me paraît très mal organisé. Je veux déposer une réclamation. Je paye mes impôts, après tout!"
    -"JE SUIS LA MORT, PAS LES IMPÔTS! MOI, JE N'ARRIVE QU'UNE FOIS".

    Pieds d'argile (1996), Terry Pratchett 1948 - 2015
    (trad. Patrick Couton)

  10. #10
    Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 72
    Points : 47
    Points
    47
    Par défaut
    ben...maintenant j'aimerai savoir:

    comment peut on appeler une method au lieu d'un constructeur?

    Supposons aussi qu'on a plusieurs methodes donc comment le choix de l'appel serait-il fait?

    une question un peu deplassée: est ce qu'on peut implimenter un return pour un constructeur??

  11. #11
    Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    72
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 72
    Points : 47
    Points
    47
    Par défaut
    j'ai essayé de remplacer le constructeur par le choix d'une methode connaissant son nom et sachant qu'elle prend une chaine de caractere comme argument mais j'ai 2 problemes de syntaxe... voici le code:


    Class classe = Class.forName (chemin); //chemin=package.class
    java.lang.reflect.Method m =
    classe.getMethod (method, String.class);// method= nom de la methode
    m.newInstance (new Object [] {msg});
    // msg= le texte que la methode va prendre en argument

    le compilateur indique que les fautes se trouvent au niveau de getMethod et new instance

  12. #12
    Membre chevronné
    Avatar de Deadpool
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    1 312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 1 312
    Points : 2 011
    Points
    2 011
    Par défaut
    Citation Envoyé par thesorrow
    ben...maintenant j'aimerai savoir:

    comment peut on appeler une method au lieu d'un constructeur?

    Supposons aussi qu'on a plusieurs methodes donc comment le choix de l'appel serait-il fait?
    Alors, oui, il est évidemment possible d'appeler une méthode par réflexivité via la méthode getMethod.

    Celle-ci prend 2 paramètres, le nom de la méthode (sous la forme d'un String) ainsi que sa signature (un tableau d'objet Class comme pour getConstructor).

    Voici un peu de code pour illustrer tout ça, ça sera beaucoup plus parlant :

    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
     
    package reflect.exemple;
     
    /**
     * 
     * La classe que l'on va invoquer par réflexion
     * Une classe toute bête permettant d'afficher un message un certain nombre de fois.
     */
    public class MessageDisplayer {
     
    	private String message;
     
    	public MessageDisplayer(String message) {
    		this.message = message;
    	}
     
    	public String getMessage() {
    		return message;
    	}
     
    	public void setMessage(String message) {
    		this.message = message;
    	}
     
    	public void display(int times){
    		for (int i=0; i<times;i++){
    			System.out.println(getMessage());
    		}
    	}
     
    }
     
    package reflect.exemple;
     
    import java.lang.reflect.Constructor;
    import java.lang.reflect.Method;
     
    /**
     * 
     * La classe qui va implémenter la reflexion
     * 
     */
    public class Invoker {
     
    	public static void main(String[] args) {
    		// la chaîne que l'on va afficher grâce à l'autre classe
    		String msg = "Hello World by Reflection!";
     
    		try {
    			// Récupération de la classe MessageDisplayer
    			Class classe = Class.forName("reflect.exemple.MessageDisplayer");
    			// Récupération du constructeur prenant en paramètre une chaîne de
    			// caractères
    			Constructor constructeur = classe
    					.getConstructor(new Class[] { String.class });
    			// invocation du constructeur
    			//on récupère l'instance de la classe MessageDisplayer que l'on vient de créer
    			Object instance = constructeur.newInstance(new Object[] { msg });
     
    			// maintenant on va récupérer la méthode pour afficher le message
    			//en passant en paramètre son nom (Display) et sa signature (int)
    			Method methode = classe.getMethod("display", new Class[] { int.class });
     
    			//et on l'invoque en passant en paramètre l'instance de l'objet sur lequel on invoque la méthode
    			//(ici l'objet instance que l'on vient de créer avec le constructeur)
    			//ainsi que ses arguments (pour la méthode display, il n'y a qu'un paramètre int
    			//indiquant le nombre de fois que l'on veut afficher le message, par exemple 5)
     
    			methode.invoke(instance, new Object[]{ Integer.valueOf(5) });
     
    			//Note : pour passer le paramètre int je suis obligé de passer par la classe enveloppe Integer
    			//car un int n'est pas un Object
     
    		} catch (Exception e) {
    			// si une erreur se produit on affiche la pile d'erreur
    			e.printStackTrace();
    		}
     
    	}
    Voilà, ça devrait t'aider à comprendre le principe.

    J'attire ton attention sur l'invocation de la méthode qui est plus complexe que d'invoquer un constructeur.
    Si c'est pas clair n'hésite pas.

    Citation Envoyé par thesorrow
    une question un peu deplassée: est ce qu'on peut implimenter un return pour un constructeur??
    Non, il est impossible de mettre un return pour les constructeurs. C'est dû au fait que les constructeur n'ont pas comme les méthodes de type de retour.

    -"Tout ça me paraît très mal organisé. Je veux déposer une réclamation. Je paye mes impôts, après tout!"
    -"JE SUIS LA MORT, PAS LES IMPÔTS! MOI, JE N'ARRIVE QU'UNE FOIS".

    Pieds d'argile (1996), Terry Pratchett 1948 - 2015
    (trad. Patrick Couton)

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

Discussions similaires

  1. ArrayList<Class> class class.setString()
    Par Onelove dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 31/08/2014, 19h42
  2. Probleme avec les fichiers .class
    Par Katachana dans le forum Langage
    Réponses: 2
    Dernier message: 13/07/2007, 11h49
  3. [Prototype] Prototype Window Class
    Par titou250 dans le forum Bibliothèques & Frameworks
    Réponses: 1
    Dernier message: 05/07/2006, 18h15
  4. probleme avec la classe calendar
    Par fatmax dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 04/10/2005, 17h04
  5. Réponses: 13
    Dernier message: 02/02/2005, 00h21

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