Précédent   Forum du club des développeurs et IT Pro > Java > Général Java
Général Java Java SE, Java ME, APIs, Persistance, JDBC, Spring, XML. Avant de poster -> FAQ Java, Sources Java
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 04/11/2012, 14h16   #1
Cafeinoman
Membre à l'essai
 
Homme François Delalleau
Étudiant
Inscription : octobre 2012
Messages : 25
Détails du profil
Informations personnelles :
Nom : Homme François Delalleau
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : octobre 2012
Messages : 25
Points : 22
Points : 22
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 :
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...
Cafeinoman est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/11/2012, 17h52   #2
thelvin
Modérateur
 
Inscription : septembre 2004
Messages : 7 286
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 7 286
Points : 10 611
Points : 10 611
Envoyer un message via Skype™ à thelvin
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 :
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 :
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.
thelvin est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/11/2012, 12h16   #3
Cafeinoman
Membre à l'essai
 
Homme François Delalleau
Étudiant
Inscription : octobre 2012
Messages : 25
Détails du profil
Informations personnelles :
Nom : Homme François Delalleau
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : octobre 2012
Messages : 25
Points : 22
Points : 22
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...
Cafeinoman est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/11/2012, 17h26   #4
tchize_
Expert Confirmé Sénior
 
Avatar de tchize_
 
Homme
Responsable de service informatique
Inscription : avril 2007
Messages : 18 413
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : Belgique

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Service public

Informations forums :
Inscription : avril 2007
Messages : 18 413
Points : 33 157
Points : 33 157
Envoyer un message via MSN à tchize_ Envoyer un message via Skype™ à tchize_
Tu peux utiliser Class.getConstructors() pour avoir tous les constructeur et les analyser si t'as besoin de savoir dynamiquement ce qui existe.
__________________
⥀⥁ Чиз faq java, cours java, javadoc. Pensez à et
Laisse entrer le jour après une nuit sombre. Si tu es toujours là, tu n'es pas faite pour mourir.
tchize_ est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 15/11/2012, 21h47   #5
Cafeinoman
Membre à l'essai
 
Homme François Delalleau
Étudiant
Inscription : octobre 2012
Messages : 25
Détails du profil
Informations personnelles :
Nom : Homme François Delalleau
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : octobre 2012
Messages : 25
Points : 22
Points : 22
Tout simplement...

Je passe en résolu, merci!
Cafeinoman est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 13h47.


 
 
 
 
Partenaires

Hébergement Web