OVH Cloud OVH Cloud

ForName trouble

13 réponses
Avatar
toto
Bonjour,

Je vous expose mon problème.
Je précise que maintes recherches sur google
et dans les meilleurs librairies ne m'ont pas éclairées.

J'ai crée une classe pour simuler une énumération :

public final class NumeroCase {
private final String name;
public static final NumeroCase out = new NumeroCase("0ut");
public static final NumeroCase c1 = new NumeroCase("1"),
c2 = new NumeroCase("2"),
c3 = new NumeroCase("3"),
......
.....
C44 = new NumeroCase("44");

private NumeroCase(String name) {
this.name = name;
}
public String toString() {
return name;
}
}

Maintenant à l'intérieur d'une autre classe
je veux parcourir les éléments de cette énumération :

for (int i = 1; i <= 44; i++) {
Class clnc = null;
try {
clnc = Class.forName("NumeroCase.c" +
i,true,ClassLoader.getSystemClassLoader());
Object o = clnc.newInstance();
......
.....

Et bien voilà : ça ne marche pas ....le ClassLoader me dit qu'il ne trouve
pas
les classes NumeroCase.Ci

Merci de votre aide

10 réponses

1 2
Avatar
Sylvain
Pb de débutant
Tu n'as pas créé plusieurs classes NumeroCase1,NumeroCase2 mais un
constructeur avec un parametre.

Dans la nouvelle version 1.5 de java, je crois qu'il y a les enumérations.
Avatar
Régis Troadec
Salut,

"toto" a écrit dans le message de news:
8zaVb.8286$
Bonjour,

Je vous expose mon problème.
Je précise que maintes recherches sur google
et dans les meilleurs librairies ne m'ont pas éclairées.

J'ai crée une classe pour simuler une énumération :

public final class NumeroCase {
private final String name;
public static final NumeroCase out = new NumeroCase("0ut");
public static final NumeroCase c1 = new NumeroCase("1"),
c2 = new NumeroCase("2"),
c3 = new NumeroCase("3"),
......
.....
C44 = new NumeroCase("44");

private NumeroCase(String name) {
this.name = name;
}
public String toString() {
return name;
}
}

Maintenant à l'intérieur d'une autre classe
je veux parcourir les éléments de cette énumération :

for (int i = 1; i <= 44; i++) {
Class clnc = null;
try {
clnc = Class.forName("NumeroCase.c" +
i,true,ClassLoader.getSystemClassLoader());


Tes NumeroCase.ci sont des instances de classes (des objets), pas des
classes.

Object o = clnc.newInstance();


Le contructeur de NumeroCase etant privé, java risque de ne pas aimer et de
balancer une belle exception.

......
.....

Et bien voilà : ça ne marche pas ....le ClassLoader me dit qu'il ne trouve
pas
les classes NumeroCase.Ci

Merci de votre aide



Utilise getDeclaredConstructor(Class[] param) (java.lang.Class) pour
récupérer le constructeur de la classe NumeroCase prenant en parametres ce
qui est specifie dans le tableau param. Une fois l'objet Constructor obtenu,
tu peux appeler la methode newInstance(monArg) prenant en parametre le truc
monArg correspondant à param.

Exple simple :

// NumeroCase.java

import java.lang.*;

public final class NumeroCase {
private final String name;
public static final NumeroCase out = new NumeroCase("0ut");
public static final NumeroCase c1 = new NumeroCase("1"),
c2 = new NumeroCase("2"),
c3 = new NumeroCase("3");

public NumeroCase(String name) {
this.name = name;
}
public String toString() {
return name;
}
}

// AnotherClasse.java

import java.lang.*;
import java.lang.reflect.*;
import java.io.*;
import java.util.*;

public class AnotherClasse {

private Vector v;
private Constructor cstr;
private Class param[] = new Class[1];
private Object Obj[] = new Object[1];

public AnotherClasse()
{
Class clnc = null;

try
{
// recup classe NumeroCase
clnc = Class.forName("NumeroCase"
,true,ClassLoader.getSystemClassLoader());
param[0] = Class.forName("java.lang.String");
// recup du constructeur (Constructor) de clnc prenant en parametre
une String
cstr = clnc.getDeclaredConstructor(param);

v = new Vector(3);
for (int i = 1; i <= 3; i++) {
Obj[0]=(Object)Integer.toString(i);
v.add(cstr.newInstance(Obj)); // j'ajoute un NumeroCase(i) dans
mon vecteur
}
}
catch(Exception ex)
{
System.out.println("Merdouille, see below : ");
ex.printStackTrace();
}

}

public void dump()
{
for (int i=0; i<3; i++)
System.out.println(v.elementAt(i));
}

public static void main(String args[])
{
AnotherClasse exple = new AnotherClasse();
exple.dump();
}

}

a+, regis

Avatar
toto
"Sylvain" a écrit dans le message de
news:wibVb.8305$
Pb de débutant
Tu n'as pas créé plusieurs classes NumeroCase1,NumeroCase2 mais un
constructeur avec un parametre.

Dans la nouvelle version 1.5 de java, je crois qu'il y a les enumérations.


Débutant..ouais moins que vous !!

Le problème ne vient pas de ma classe d'énumération
La classe NuméroCase, elle provient d'un design pattern,
bien valide. Ici j'ai fait du copier coller à partir dudit design pattern.

Donc avant de répondre, il faut être plus sûr de son niveau, monsieur
Sylvain.

Avatar
toto
Merci infiniment Régis,
je m'empresse d'essayer votre solution.
Je bloque sur ce truc depuis pas mal de temps !
Avatar
toto
Arrghh...en fait ça ne marche pas.

Je ne veux pas accéder au constructeur de la
classe d'énumération (et pour cause : il est privé)

Je veux accéder aux instances de cette classe
i.e. : NumeroCase.c1, NumeroCase.c2...

En fait je voudrais un truc du genre.
NumeroCase ci = NumeroCase.Ci

Si je fait :
NumeroCase c1 = NumeroCase.c1...ça marche bien sûr.

Mais je vais pas faire 44 déclarations.

Donc je veux par exemple :
NumeroCase c + toString(i) = NumeroCase.c + toString(i)
Avatar
Régis Troadec
Salut,

"toto" a écrit dans le message de news:
6ozVb.8584$
Arrghh...en fait ça ne marche pas.

Je ne veux pas accéder au constructeur de la
classe d'énumération (et pour cause : il est privé)

Je veux accéder aux instances de cette classe
i.e. : NumeroCase.c1, NumeroCase.c2...

En fait je voudrais un truc du genre.
NumeroCase ci = NumeroCase.Ci

Si je fait :
NumeroCase c1 = NumeroCase.c1...ça marche bien sûr.

Mais je vais pas faire 44 déclarations.

Donc je veux par exemple :
NumeroCase c + toString(i) = NumeroCase.c + toString(i)



Je m'apercois de ma bêtise, c'était n'importe quoi ce que je t'ai posté, ma
solution créait en fait des NumeroCase à la volée au lieu de récupérer les
instances. Sans te faire un long discours, j'ai trouvé une URL avec un très
bon article qui répondra pleinement à ta question pour créer un type énuméré
NumeroCase et accéder à ses diverses instances de manière sûre.
Voici le lien :
http://gethelp.devx.com/techtips/java_pro/10MinuteSolutions/10min0600.asp

Je reste à ta dispositon pour d'éventuels éclaircissements.

a+, régis

Avatar
toto
Ok merci,

j'avais vu plusieurs solutions pour réaliser le type
énuméré, mais je ne connaissais pas celle-ci.

Entre-temps j'ai trouvé une méthode de
la classe Class : Field[] getFields.
Elle retourne tous les champs publics d'une classe dans un tableau.

Mais le mieux est d'avoir le plus de solution possible !

N'empêche, j'aimerais bien me mettre au C#...

@+
Avatar
news.wanadoo.fr
Ben moi je me fous qu'on me prenne pour un debutant ou un gourou. La preuve
? ^^
Je serais assez d'accord avec Sylvain pour dire que tu as créé plusieurs
instances de la classe NumeroCase. Ce n'est pas le cas ? et si oui pourquoi
? Eclaire-moi !
"toto" a écrit dans le message news:
wTnVb.8409$
"Sylvain" a écrit dans le message de
news:wibVb.8305$
Pb de débutant
Tu n'as pas créé plusieurs classes NumeroCase1,NumeroCase2 mais un
constructeur avec un parametre.

Dans la nouvelle version 1.5 de java, je crois qu'il y a les
enumérations.




Débutant..ouais moins que vous !!

Le problème ne vient pas de ma classe d'énumération
La classe NuméroCase, elle provient d'un design pattern,
bien valide. Ici j'ai fait du copier coller à partir dudit design pattern.

Donc avant de répondre, il faut être plus sûr de son niveau, monsieur
Sylvain.





Avatar
jocelyn
Hop autant pour moi; vous avez tous les 2 raison :)
Tu as raison de dire que tu fais une enumeration.
Sylvain a raison de dire que tu n'as pas cree plusieurs classes.
Vous avez raison de me dire que mon post sert à rien aussi :P
Je ferais mieux la prochaine fois...

"news.wanadoo.fr" a écrit dans le message news:
c08cvd$d3q$
Ben moi je me fous qu'on me prenne pour un debutant ou un gourou. La
preuve

? ^^
Je serais assez d'accord avec Sylvain pour dire que tu as créé plusieurs
instances de la classe NumeroCase. Ce n'est pas le cas ? et si oui
pourquoi

? Eclaire-moi !
"toto" a écrit dans le message news:
wTnVb.8409$
"Sylvain" a écrit dans le message de
news:wibVb.8305$
Pb de débutant
Tu n'as pas créé plusieurs classes NumeroCase1,NumeroCase2 mais un
constructeur avec un parametre.

Dans la nouvelle version 1.5 de java, je crois qu'il y a les
enumérations.




Débutant..ouais moins que vous !!

Le problème ne vient pas de ma classe d'énumération
La classe NuméroCase, elle provient d'un design pattern,
bien valide. Ici j'ai fait du copier coller à partir dudit design
pattern.



Donc avant de répondre, il faut être plus sûr de son niveau, monsieur
Sylvain.









Avatar
toto
Non mais ce qui m'a agacé c'est que Sylvain
indique que la version 1.5 va proposer
l'énumération...

Très bien, mais en attendant, je fais quoi ?
je passe au C# ?

ça réponse n'était pas constructive.

voilà tout.

Tandis que Régis m'a proposé plusieurs solutions.

On voit bien les deux types d'approches pour
une réponse sur un tel forum

Soit : "petit débutant laisse moi éclairer ta nullité"
Soit :"petit débutant ta nullité peut nous éclairer"
1 2