IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Collection et Stream Java Discussion :

Passer un champ à null en utilisant l'introspection


Sujet :

Collection et Stream Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 22
    Par défaut Passer un champ à null en utilisant l'introspection
    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

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    Généralement les exceptions sont assez instructive sur l'origine de l'erreur...

    a++

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 22
    Par défaut
    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.

  4. #4
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par jeanvalery Voir le message
    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 ne vois nulle part dans la doc que cet argument n'est pas accepté !?


    Je reformule moi aussi : sans code source ni la trace complète de l'exception, personne ne pourra t'aider à trouver l'origine du problème... à moins d'avoir une boule de cristal !

    a++

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 22
    Par défaut
    Bah oui mais lui il me dit ca :
    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)
    pour ce code :

    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();
    }
    }

  6. #6
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    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++

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 22
    Par défaut
    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 :
    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)
    Et j'utilise la jre 1.5.0_06

    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

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 22
    Par défaut Erratum
    Je fais
    f.set(o,null)
    là où il faut faire
    f.set(objet,null)

  9. #9
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Voilà pourquoi c'est très utile d'utiliser des noms de variables explicites

    a++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. INSTR sur un champ vide, Detecter un champ null
    Par rodolphedj dans le forum ASP
    Réponses: 4
    Dernier message: 06/09/2004, 15h24
  2. passer un champ en paramètre, c'est possible ??
    Par marie253 dans le forum Bases de données
    Réponses: 6
    Dernier message: 09/07/2004, 09h22
  3. Selectionner un champs null
    Par maadadi dans le forum Langage SQL
    Réponses: 2
    Dernier message: 12/02/2004, 14h08
  4. Passer une valeur Null dans un argument de procédure
    Par preempalver dans le forum VBA Access
    Réponses: 5
    Dernier message: 30/12/2003, 20h52
  5. Alter column => passer de NOT NULL à NULL
    Par JohnGT dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 17/10/2003, 11h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo