Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

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

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 wink

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