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 :

Utilisation de la classe Class


Sujet :

Java

  1. #1
    Membre éprouvé
    Avatar de Cafeinoman
    Homme Profil pro
    Couteau suisse d'une PME
    Inscrit en
    Octobre 2012
    Messages
    628
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Couteau suisse d'une PME

    Informations forums :
    Inscription : Octobre 2012
    Messages : 628
    Points : 1 256
    Points
    1 256
    Par défaut Utilisation de la classe Class
    Bonjour à tous,

    j'ai un soucis avec l'utilisation de Class. J'ai besoin , je pense, de passer un paramètre à la méthode .newIntance(). Je vous donne le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    	public void afficheObjet(Class<?> classe, int col, int lig) throws InstantiationException, IllegalAccessException{
     
    		classe.newInstance();
     
    		Zone crt = listZones.get(col+(lig-1)*dim);
    		crt.setOccupe(true);
    		crt.setImageFond(classe.getName());
    		crt.repaint();
     
     
    	}
    Mon problème c'est que les classes instanciées ont toute au moins un paramètre à prendre en compte, et que je ne comprend pas comment lui dire quels sont les paramètres du constructeur...

    Et tant que j'y suis, vaut-il mieux utiliser le throws ou un multi Try/catch? Je ne saisi pas bien les conséquences du choix...
    «Dieu ne joue pas aux dés.» - Albert Einstein. Et pan! 30 ans de retard dans la théorie quantique!
    «Tout n'est pas politique, mais la politique s'intéresse à tout.» - Nicolas Machiavel. Et surtout à ceux qui ne s'y intéressent pas.

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 547
    Points : 21 602
    Points
    21 602
    Par défaut
    Citation Envoyé par Cafeinoman Voir le message
    Mon problème c'est que les classes instanciées ont toute au moins un paramètre à prendre en compte, et que je ne comprend pas comment lui dire quels sont les paramètres du constructeur...
    newInstance() ne peut appeler que le constructeur sans paramètre (en supposant qu'il y en ait un. Sinon, newInstance() ne marche pas et c'est marre.)

    Pour les constructeurs avec paramètre, il faut récupérer le Constructor correspondant, et s'en servir.

    La FAQ n'en parle pas, alors voici un petit exemple :

    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
    public class Person {
      private final int age;
      // un seul constructeur, et il prend un int en paramètre
      public Person(int age) {
        this.age = age;
      }
      public int getAge() {
        return age;
      }
     
      // Essayons d'en instancier un avec Class.
      public static void main(String[] args) throws Exception {
        Class<?> clazz = Person.class;
     
        // Récupérer le Constructor
        Constructor<?> constructor = clazz.getConstructor(Integer.TYPE);
        // Un paramètre de type int se demande avec Integer.TYPE
     
        // Appel du constructeur avec un paramètre
        Object object = constructor.newInstance(27);
     
        // On vérifie que c'est ce qui était demandé
        Person person = (Person)object;
        System.out.println(person.getAge());
      }
    }
    Citation Envoyé par Cafeinoman Voir le message
    Et tant que j'y suis, vaut-il mieux utiliser le throws ou un multi Try/catch? Je ne saisi pas bien les conséquences du choix...
    Question de point de vue, mais le mien c'est que ces exceptions n'ont pas besoin d'être déclarées.
    Normalement elles sont le résultat d'une erreur de programmation, elles ne dépendent que des programmeurs, qui n'ont pas respecté leurs propres conditions d'utilisation : la classe doit être une classe concrète, l'accès à ses constructeurs doit être autorisé.
    Du coup elles n'arriveront que tant qu'il y aura erreur de programmation, et pas ensuite. Elles ne peuvent arriver que pendant les phases de tests, pas plus tard.

    Du coup je les choperais toutes dans des catch(), qui masquerait ces exceptions dans une exception non déclarée, comme IllegalStateException (parce que avoir pris une classe ou un constructeur qui répond pas aux conditions, c'est un état inattendu et invalide) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    } catch(IllegalAccessException e) {
      throw new IllegalStateException(e.getMessage(), e);
    }
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre éprouvé
    Avatar de Cafeinoman
    Homme Profil pro
    Couteau suisse d'une PME
    Inscrit en
    Octobre 2012
    Messages
    628
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Couteau suisse d'une PME

    Informations forums :
    Inscription : Octobre 2012
    Messages : 628
    Points : 1 256
    Points
    1 256
    Par défaut
    Merci! Je me doutais qu'il fallait passer par le constructeur, mais je n'arrivais pas à formuler la chose...

    Reste un problème avant de passer en résolu : comment faire pour que le nombre et le type de paramètres soit défini soient trouvés tout seul? En admettant bien sur que leur valeur est défini de manière aléatoire, ou qu'on appel des boîtes de dialogue au fur et à mesure...
    «Dieu ne joue pas aux dés.» - Albert Einstein. Et pan! 30 ans de retard dans la théorie quantique!
    «Tout n'est pas politique, mais la politique s'intéresse à tout.» - Nicolas Machiavel. Et surtout à ceux qui ne s'y intéressent pas.

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Tu peux utiliser Class.getConstructors() pour avoir tous les constructeur et les analyser si t'as besoin de savoir dynamiquement ce qui existe.

  5. #5
    Membre éprouvé
    Avatar de Cafeinoman
    Homme Profil pro
    Couteau suisse d'une PME
    Inscrit en
    Octobre 2012
    Messages
    628
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Couteau suisse d'une PME

    Informations forums :
    Inscription : Octobre 2012
    Messages : 628
    Points : 1 256
    Points
    1 256
    Par défaut
    Tout simplement...

    Je passe en résolu, merci!
    «Dieu ne joue pas aux dés.» - Albert Einstein. Et pan! 30 ans de retard dans la théorie quantique!
    «Tout n'est pas politique, mais la politique s'intéresse à tout.» - Nicolas Machiavel. Et surtout à ceux qui ne s'y intéressent pas.

+ 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, 20h42
  2. Réponses: 5
    Dernier message: 22/01/2006, 10h10
  3. débutant:utilisation de variable entre classe
    Par troojan dans le forum MFC
    Réponses: 1
    Dernier message: 08/12/2005, 00h31
  4. utiliser mysql++ dans une classe
    Par Yevetrovitch dans le forum Bibliothèques
    Réponses: 2
    Dernier message: 11/04/2005, 11h53
  5. Utilisation iterator avec une classe perso
    Par SteelBox dans le forum C++
    Réponses: 19
    Dernier message: 07/03/2005, 12h30

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