Bonjour à tous,
je voulais savoir s'il existait un moyen simple en utilisant l'introspection de passer un champ (java.lang.reflect.Field) à null. En utilisant la methode set de la classe Field, j'ai droit à un illegalArgumentException.
Merci
Version imprimable
Bonjour à tous,
je voulais savoir s'il existait un moyen simple en utilisant l'introspection de passer un champ (java.lang.reflect.Field) à null. En utilisant la methode set de la classe Field, j'ai droit à un illegalArgumentException.
Merci
Salut,
Généralement les exceptions sont assez instructive sur l'origine de l'erreur...
a++
Ok, je reformule...
ayant compris que je ne pouvais utiliser la methode set de Field pour le passer à null, car j'ai bien saisi que cet argument n'etait pas accepté, je cherche à savoir s'il existe un moyen disons "générique" pour passer certains champs de ma classe à null.
Bah oui mais lui il me dit ca :
pour ce code :Citation:
java.lang.IllegalArgumentException at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:37)
at sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:57)
at java.lang.reflect.Field.set(Field.java:656)
Citation:
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();
}
}
Bizarre que tu n'ai pas plus de détail sur l'exception (tu utilises quelle version de Java ?)
Sinon cela plante sur quel champ ? Et comment est-il déclaré ?
a++
en fait, j'ai plus de trace mais il s'agit des remontées dans mon code, mais a tout hasard je te poste les autres traces :
Et j'utilise la jre 1.5.0_06Citation:
ERROR (TraitementObjets.java:165) | restoreNullFields - Attribution de null à un champ a echoué :: class java.lang.IllegalArgumentException
java.lang.IllegalArgumentException
at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:37)
at sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:57)
at java.lang.reflect.Field.set(Field.java:656)
at sas.gestsit.commun.utils.TraitementObjets.restoreNullFields(TraitementObjets.java:161)
at sas.gestsit.commun.server.F_Idl_RESCO.saveFormulaire(F_Idl_RESCO.java:227)
at sas.gestsit.commun.server.F_Idl_RESCO.saveCSARIR(F_Idl_RESCO.java:242)
at sas.gestsit.commun.server.GESTSITServicesRESCOImpl.saveCSARIR(GESTSITServicesRESCOImpl.java:199)
at sas.gestsit.commun.corba.resco.GESTSITServiceRESCOPOATie.saveCSARIR(GESTSITServiceRESCOPOATie.java:144)
at sas.gestsit.commun.corba.resco.GESTSITServiceRESCOPOA._invoke(GESTSITServiceRESCOPOA.java:374)
at com.inprise.vbroker.poa.POAImpl.invoke(POAImpl.java:2822)
at com.inprise.vbroker.poa.ActivationRecord.invoke(ActivationRecord.java:186)
at com.inprise.vbroker.poa.ServerInterceptorManager$ARWrapper.invoke(ServerInterceptorManager.java:111)
at com.inprise.vbroker.GIOP.GiopProtocolAdapter.doRequest(GiopProtocolAdapter.java:838)
at com.inprise.vbroker.IIOP.ServerProtocolAdapter.doRequest(ServerProtocolAdapter.java:68)
at com.inprise.vbroker.GIOP.GiopProtocolAdapter.dispatchMessage(GiopProtocolAdapter.java:1120)
at com.inprise.vbroker.orb.TPDispatcherImpl$TPDispatcher.run(TPDispatcherImpl.java:100)
at com.inprise.vbroker.orb.ThreadPool$PoolWorker.run(ThreadPool.java:76)
Je passe le code au debugger, et ca plante systematiquement sur chaque champ : du Long, Integer, String, Timestamp déclarés public.
Le premier champ, par exemple est un Long de valeur -1.
Merci pour ton aide
Je faislà où il faut faireCitation:
f.set(o,null)
Citation:
f.set(objet,null)
Voilà pourquoi c'est très utile d'utiliser des noms de variables explicites :mouarf:
a++ ;)