pour les programmeurs confirmés... [Java] - Java - Programmation
Marsh Posté le 18-06-2002 à 15:23:16
et c'est quoi ton problème ?
déjà, tu peux faire un Class.getDeclaredConstructor(Class[] parameterTypes) , ca ira plus vite.
ensuite, tu as juste à faire un appel Constructor.newInstance(Object[] initargs) avec les paramètres que tu auras mit dans le tableau
Marsh Posté le 18-06-2002 à 15:26:29
benou a écrit a écrit : déjà, tu peux faire un Class.getDeclaredConstructor(Class[] parameterTypes) , ca ira plus vite. |
c vrai que ça c pas mal, mais il faut des Class, comme ça se passe si j'ai des types primitifs comme boolean ou int ?
Marsh Posté le 18-06-2002 à 15:44:11
Il me semble; que plutôt de faire avec un getParamatersType, tu devrais directement construire ton tableau d'arguments, en utilisant les objets associés aux types primitifs : la Javadoc de java.lang.reflect.Constructor explique que :
"If the corresponding formal parameter has a primitive type, an unwrapping conversion is attempted to convert the object value to a value of the primitive type. If this attempt fails, the creation throws an IllegalArgumentException.
If, after possible unwrapping, the parameter value cannot be converted to the corresponding formal parameter type by a method invocation conversion, the creation throws an IllegalArgumentException. "
Ouala...
Marsh Posté le 18-06-2002 à 15:46:30
parfait, je teste tout ça ! (il assure bien le package java.lang.reflect)
Marsh Posté le 18-06-2002 à 15:49:00
Ouais, mais il rame...C'est pour ça que je ne saurait trop te conseiller de gérer du cache : à chaque instanciation de constructeur, ou de classe, essaie de le garder qqpart en mémoire (genre, dans une hashtable indexée par nom complet de classe, qui contient des HashTable avec les cionstructeurs, par exemple) histoire que quand tu as une nouvelle instantiaton à faire, tu va d'abord regarder dans la hashtable si tu a pas déjà fait le boulot 30 secondes avant.
Marsh Posté le 18-06-2002 à 15:54:18
z0rglub a écrit a écrit : c vrai que ça c pas mal, mais il faut des Class, comme ça se passe si j'ai des types primitifs comme boolean ou int ? |
ca pose pas de problème les types primitif :
Code :
|
Marsh Posté le 18-06-2002 à 16:15:15
mon pb, c'est d'avoir un int dans le Class[] je vois pas comment faire (sachant que je ne sais pas à l'avance que ce sera un int !)
par ce que Class.forName( "int" ) çame renvoie une ClassNotFoundException ...
Marsh Posté le 18-06-2002 à 16:17:50
topic pour développeurs confirmés tu disais ...
Integer c pour les blairos ?
Marsh Posté le 18-06-2002 à 16:19:08
HappyHarry a écrit a écrit : topic pour développeurs confirmés tu disais ... Integer c pour les blairos ? |
yep, comme tu dis, mais tu peux m'expliquer plus précisément ?
Marsh Posté le 18-06-2002 à 16:20:06
Bah, tu te fais un p'tit parser :
Soit le mec met un nom de classe complet (genre Boolean, ou Integer...) et si il met un nom de type primitif, tu instancies la bonne classe...C'est pas sorcier à faire, et y'a pâs des masses de types primitifs.
Marsh Posté le 18-06-2002 à 16:20:29
z0rglub a écrit a écrit : mon pb, c'est d'avoir un int dans le Class[] je vois pas comment faire (sachant que je ne sais pas à l'avance que ce sera un int !) par ce que Class.forName( "int" ) çame renvoie une ClassNotFoundException ... |
Je vois pas d'autre solutions que de faire plein de if ...
fait-toi une méthode getClassObject(String type) qui te retourne le Class à mettre dans le tableau d'argument :
if (type.equals("int" ))
return int.class;
...
else
return Class.forName(type);
Marsh Posté le 18-06-2002 à 16:27:11
HappyHarry a écrit a écrit : hé ben ... |
bon tu vois, que c pas si simple...
je voulais un truc générique, mais je vais devoir faire tout un tas de if...
j'avais déjà un if, qui vérifiais la présence de "." parce que par défaut on peut mettre "String" au lieu de "java.lang.String" parce que Class.forName( "String" ) -> ClassNotFoundException
Marsh Posté le 18-06-2002 à 16:28:47
z0rglub a écrit a écrit : bon tu vois, que c pas si simple... je voulais un truc générique, mais je vais devoir faire tout un tas de if... j'avais déjà un if, qui vérifiais la présence de "." parce que par défaut on peut mettre "String" au lieu de "java.lang.String" parce que Class.forName( "String" ) -> ClassNotFoundException |
"he ben..." c t pour hé ben en voila un qui a pas lu toute la doc et qui connait pas les wrappers pour les types primitifs
Marsh Posté le 18-06-2002 à 16:32:18
HappyHarry a écrit a écrit : "he ben..." c t pour hé ben en voila un qui a pas lu toute la doc et qui connait pas les wrappers pour les types primitifs |
pourquoi tu cherches à l'ennerver ??? C'et vrai que le titre est racoleur et n'explique pas le thème du post, mais c'est pas une raison pour être sur son dos comme ca. Son roblème est pas aussi simple que tu essaye de lui faire croire.
Les Wrappers ne règlent pas tous les problèmes !
comment faire la différence entre une méthode void f(Integer i) et void f(int i) ??
alors aide le plutot si tu as l'habitude de ce genre de problème !
Marsh Posté le 18-06-2002 à 16:33:18
HappyHarry a écrit a écrit : "he ben..." c t pour hé ben en voila un qui a pas lu toute la doc et qui connait pas les wrappers pour les types primitifs |
en plus je suis d'accord avec lui : je trouve que la série de if pour tester tous les types primitifs n'est pas propre. Si quelqu'un connaît une autre méthode, je suis preneur aussi !
Marsh Posté le 18-06-2002 à 16:38:55
HappyHarry a écrit a écrit : "he ben..." c t pour hé ben en voila un qui a pas lu toute la doc et qui connait pas les wrappers pour les types primitifs |
et puis je suis pas nul au point de pas savoir qu'il y a des Integer, Float... mais ce n'est absolument pas applicable dans ce cas précis...
Sinon, le titre n'est pas si racoleur, et je savais pas koi mettre parce que c'est un pb assez tiré par les cheveux...
Marsh Posté le 18-06-2002 à 16:51:48
moi je serais plutot d'accord avec gfive en fait : imposer une norme pour le nommage des types, ca te simplifiera la vie
Marsh Posté le 18-06-2002 à 16:55:10
benou a écrit a écrit : bon, sinon tu t'en sort avec la série de if ? |
Code :
|
Marsh Posté le 18-06-2002 à 16:58:57
ouais ... c'est pas très beau mais je sais pas comment faire autrement.
Pour optimiser, tu peux mettre les Class des types primitifs dans une HashMap. La recherche sera plus rapide ...
Marsh Posté le 18-06-2002 à 17:16:56
ok, alors j'ai fait ça :
Code :
|
primitveTypes est un Map static
puis
Code :
|
(je considère que si le type sous forme de chaîne est le même en minuscule et initial, c'est un type primitif... et non une classe
Marsh Posté le 18-06-2002 à 18:02:35
cado :
Code :
|
Marsh Posté le 18-06-2002 à 18:09:49
ok, super sympa, c'est plus propre que ma méthode en tout cas !
Marsh Posté le 18-06-2002 à 18:16:10
ah oui, et puis je lutte encore pour un truc : comme je fais pour que lorsque le type trouvé est int, il me transforme ma chaîne value ="1" en 1 tout court, idem pour un boolean que je met à true, vous voyez ce que je veux dire...
Marsh Posté le 18-06-2002 à 19:55:10
z0rglub a écrit a écrit : ah oui, et puis je lutte encore pour un truc : comme je fais pour que lorsque le type trouvé est int, il me transforme ma chaîne value ="1" en 1 tout court, idem pour un boolean que je met à true, vous voyez ce que je veux dire... |
Pour le "1" en 1 c Interger.parseInt(String)
et pour le booléen Boolean.getBoolean(String)
Marsh Posté le 18-06-2002 à 20:11:55
ok, en fait je vais faire une méthode pour récupérer à partir de type et value (sous forme de string tous les 2) un objet de type Class + 1 Objet de type Object en essayant de rendre compte de tous les cas
Marsh Posté le 18-06-2002 à 23:05:31
anntention : regarde bien l'exemple que je t'avais fillé prédement avec l'appel à la méthode substring : le tableau de Class indique bien la class String, pourtant c'est un Integer qu'il faut mettre dans le tableau de paramètre.
donc il ne faut pas que tu utilises Integer.parseInt(String).
Tu peux utiliser le constructeur de Integer pour ca : new Integer(String)
Marsh Posté le 18-06-2002 à 23:10:31
comme le but, c'est de récupérer un int, il va falloir faire new Integer(String).intValue()
idem pour le Boolean
Marsh Posté le 18-06-2002 à 23:14:35
non. Le but c'est de passer une valeur en paramètre au constructeur (enfin si j'ai bien compris). Comme tu dois mettre cette valeur dans un tableau d'objet, tu ne peut pas mettre un int (int n'est pas un objet). Tu mets un Integer dedans, en la méthode se débrouillera pour se rendre compte qu'il lui faut en faite un int et ferra la transformation toute seule.
Regarde l'expemple que je t'avais donné ...
Marsh Posté le 18-06-2002 à 23:17:34
benou a écrit a écrit : Regarde l'expemple que je t'avais donné ... |
désolé mais j'ai pas compris toute ta syntaxe alors j'ai abandonné. Pour ce qui est du constructeur qui "comprend" qu'il doit transformer le Integer en int, c super, ça me simplifie le travail en fait !
Marsh Posté le 18-06-2002 à 23:23:01
z0rglub a écrit a écrit : Pour ce qui est du constructeur qui "comprend" qu'il doit transformer le Integer en int, c super, ça me simplifie le travail en fait ! |
uniquement au moment du invoke. mon exemple marche avec une méthode mais pour un constructeur c'est pareil.
je vais simplifier la syntaxe et commenter pour que tu comprennes ...
Marsh Posté le 18-06-2002 à 23:40:54
et voila :
Code :
|
Marsh Posté le 19-06-2002 à 10:06:52
parfait je viens de tester, et avec un new Integer( "3" ); (c'est ça qui est important aussi) et ça marche parfaitement. merci encore...
Marsh Posté le 18-06-2002 à 15:16:47
je cherche à utiliser un fichier XML pour lancer une méthode, plus précisément un constructeur. Je vous donne un exemple parlant (en tout cas j'espère !
Voici un morceu de mon fichier XML :
le but, c'est que je lance ceci :
évidemment, ça doit être générique, et c'est bien ça le pb !!!
Pour le moment, je récupère la classe, en utilisant Class.forName( "Truc" )
puis je récupére les constructors associés par getConstructors et enfin un petit getParamatersType pour savoir quels sont les types des paramètres à passer à chaque contructeur...
Bref, le soucis, c'est d'arriver à faire un constructors[j].newInstance( monTableauDeParametres )
---------------
Ma galerie photo créée avec Piwigo et hébergée sur Piwigo.com