+ Répondre à la discussion
Affichage des résultats 1 à 5 sur 5
  1. #1
    Membre expérimenté Avatar de Cafeinoman
    Homme Profil pro
    Couteau suisse d'une PME
    Inscrit en
    octobre 2012
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : octobre 2012
    Messages : 325
    Points : 570
    Points
    570

    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...

  2. #2
    Modérateur

    Inscrit en
    septembre 2004
    Messages
    10 279
    Détails du profil
    Informations forums :
    Inscription : septembre 2004
    Messages : 10 279
    Points : 17 153
    Points
    17 153

    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);
    }
    Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher du poisson, il videra le lac et au bout de deux ans son village ne mangera plus jamais.
    Partagez vos connaissances, mais aussi comment s'en servir.

  3. #3
    Membre expérimenté Avatar de Cafeinoman
    Homme Profil pro
    Couteau suisse d'une PME
    Inscrit en
    octobre 2012
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : octobre 2012
    Messages : 325
    Points : 570
    Points
    570

    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...

  4. #4
    Expert Confirmé Sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    avril 2007
    Messages
    22 622
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

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

    Informations forums :
    Inscription : avril 2007
    Messages : 22 622
    Points : 42 950
    Points
    42 950

    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.
    "Tchize is always good. Tchize is just milk’s attempt at being immortal"
    faq java, cours java, javadoc. Pensez à et

  5. #5
    Membre expérimenté Avatar de Cafeinoman
    Homme Profil pro
    Couteau suisse d'une PME
    Inscrit en
    octobre 2012
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : octobre 2012
    Messages : 325
    Points : 570
    Points
    570

    Par défaut

    Tout simplement...

    Je passe en résolu, merci!

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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •