#1 Le 18/09/2007, à 10:33
- jeanvalery
[RESOLU][java] Passage d'un champ à null en utilisant l'introspection
Bonjour à toutes et à tous,
désireux de passer de maniere générique certains champs de plusieurs classes à null, j'utilise l'introspection. Je recupere les champs de ma classe, et le cas échéant je fais un
field.set(object, null)
Sauf que ca j'ai pas le droit (IllegalArgumentException), alors je voulias savoir s'il existait a votre connaissance un moyen générique permettant ce genre de chose, que j'ai pas à me tapper chaque champ de chaque classe à la main.
Un grand merci,
JeanValery
Dernière modification par jeanvalery (Le 18/09/2007, à 14:58)
Membre du club des beaux Ubunteros
Hors ligne
#2 Le 18/09/2007, à 11:44
- John Matrix
Re : [RESOLU][java] Passage d'un champ à null en utilisant l'introspection
Salut,
Ton premier paramètre object est-il une instance ?
D'après la javadoc :
If the specified object argument is not an instance of the class or interface declaring the underlying field, the method throws an IllegalArgumentException.
Dernière modification par John Matrix (Le 18/09/2007, à 11:46)
Hors ligne
#3 Le 18/09/2007, à 12:28
- jeanvalery
Re : [RESOLU][java] Passage d'un champ à null en utilisant l'introspection
oui oui c'est une instance... en passant le code au debug, le crash se fait à chaque tentative, sur des champs de differents types (Long, Integer, String...)
Membre du club des beaux Ubunteros
Hors ligne
#4 Le 18/09/2007, à 13:08
- martopioche
Re : [RESOLU][java] Passage d'un champ à null en utilisant l'introspection
Je pense plutot que ça vient de là :
If the underlying field is static, the obj argument is ignored; it may be null.
Otherwise the underlying field is an instance field. If the specified object argument is null, the method throws a NullPointerException. If the specified object argument is not an instance of the class or interface declaring the underlying field, the method throws an IllegalArgumentException.
source : http://java.sun.com/j2se/1.5.0/docs/api/java/lang/reflect/Field.html#set(java.lang.Object,%20java.lang.Object)
Tu a essayé un truc du type :
field.set(field.class, null);
#5 Le 18/09/2007, à 13:14
- Martopioche
Re : [RESOLU][java] Passage d'un champ à null en utilisant l'introspection
heu... non, en fait n'importe quoi ce que j'ai écrit...
object doit faire référence à l'objet que tu veux modifier. Où est ta méthode utilitaire (qui met les null) par rapport à ces objets ?
Hors ligne
#6 Le 18/09/2007, à 13:33
- jeanvalery
Re : [RESOLU][java] Passage d'un champ à null en utilisant l'introspection
C'est pas grave, c'est deja sympa de te pencher sur mon probleme...
En fait, voilà mon code, ca sera plus parlant :
public static void restoreNullFields(Object object) {
Field[] fieldTab = object.getClass().getFields();
String s_tmp = null;
for (int i = 0; i < fieldTab.length; i++) {
try {
Field f = fieldTab[i];
Object o = f.get(object);
Class c = f.getType();
s_tmp = getStringNonNullFromObject(o,c);
if((c == Long.class && s_tmp.equals(""+LONGNULL))||
(c == Integer.class && s_tmp.equals(""+INTNULL))||
(c == String.class && s_tmp.equals(STRINGNULL))||
(c == Timestamp.class && s_tmp.equals(""+TIMESTAMPNULL))){
f.set(o,null);
}
} catch (IllegalArgumentException e) {
log.error("Attribution de null à un champ a echoué :: "+e.getClass());
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
Sachant que ces champs sont tous public et non statiques, ce sont de plus tous des champs d'instance...
Membre du club des beaux Ubunteros
Hors ligne
#7 Le 18/09/2007, à 14:47
- Martopioche
Re : [RESOLU][java] Passage d'un champ à null en utilisant l'introspection
Ok, je viens de retrouver un truc que j'avais fait, mais en faisant appel aux méthodes (j'étais passé par les accesseurs). Dans le cas d'une méthode, j'utilisais :
public void collectAllFilledAttributes() {
Method[] mt = this.getClass().getDeclaredMethods();
for (int i = 0; i < mt.length; i++) {
if (mt[i].getName().startsWith("get")) {
try {
Object valueOfAttribut = mt[i].invoke(this, new Object[0]);
} ... tout pareil
Donc j'en déduis que tu doit utiliser :
public static void restoreNullFields(Object object) {
[...]
f.set(object,null);
Dans ton cas, o est un objet contenant la valeur du champ field dans l'objet object, et donc pas du tout l'objet que tu veux explorer. Essaye ça
Dernière modification par Martopioche (Le 18/09/2007, à 14:47)
Hors ligne
#8 Le 18/09/2007, à 14:57
- jeanvalery
Re : [RESOLU][java] Passage d'un champ à null en utilisant l'introspection
Bien sur! Je suis con! Merci je me prends la tete depuis ce matin parce que j'ai mis o à la place de objet...
Bien vu l'aveugle! Et merci
Membre du club des beaux Ubunteros
Hors ligne
#9 Le 18/09/2007, à 16:05
- Martopioche
Re : [RESOLU][java] Passage d'un champ à null en utilisant l'introspection
Lol, de rien
Comme quoi, le nommage plus explicite de variables peut contribuer à éviter ce genre de situation.
Hors ligne