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

Java Discussion :

[Reflection] changement de valeur d'un booleen ? Exception bizarre


Sujet :

Java

  1. #1
    Membre régulier
    Homme Profil pro
    Responsable SI (Toulouse)
    Inscrit en
    Juillet 2009
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable SI (Toulouse)

    Informations forums :
    Inscription : Juillet 2009
    Messages : 78
    Points : 122
    Points
    122
    Par défaut [Reflection] changement de valeur d'un booleen ? Exception bizarre
    Bonjour à tous,
    J'essaye de modifier des attributs Boolean (mais aussi des boolean) en utilisant les api de réflections.
    Lorsque que j'essaye par la méthode ci-dessous j'ai cette exception :
    java.lang.IllegalArgumentException: Can not set java.lang.Boolean field com.client.keytus.models.domain.SubZone.defaultSizing to java.lang.Boolean
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(Unknown Source)
    at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(Unknown Source)
    at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(Unknown Source)
    at sun.reflect.UnsafeObjectFieldAccessorImpl.set(Unknown Source)
    at java.lang.reflect.Field.set(Unknown Source)
    at com.genui.keytus.editor.ui.CheckBoxUI.setAttribut(CheckBoxUI.java:121)
    ....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    	private void setAttribut(Boolean value){
    		try {
     
    			f.set(editedAttrib ,  value);
     
    			refresh();
     
    		} catch (IllegalArgumentException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IllegalAccessException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (InvocationTargetException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    J'ai essayé tout un tas de truc mais impossible cette exception est systématiquement levé quoi que je fasse. si quelqu'un pouvait m'aider ou me donner une piste.

    J'ai essayé la fonction set comme cela également mais en vain : f.set(editedAttrib , new Boolean(value));

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    D'après le message d'erreur, editedAttrib est un Boolean et pas un SubZone.
    Je vois pas trop ce que tu espérais que ça ferait. Si tu veux changer la valeur d'un champ, il faut indiquer pour quel objet tu veux changer la valeur de ce champ. Et il faut que l'objet en question ait le champ en question. Normal.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre régulier
    Homme Profil pro
    Responsable SI (Toulouse)
    Inscrit en
    Juillet 2009
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable SI (Toulouse)

    Informations forums :
    Inscription : Juillet 2009
    Messages : 78
    Points : 122
    Points
    122
    Par défaut
    Citation Envoyé par thelvin Voir le message
    D'après le message d'erreur, editedAttrib est un Boolean et pas un SubZone.
    Je vois pas trop ce que tu espérais que ça ferait. Si tu veux changer la valeur d'un champ, il faut indiquer pour quel objet tu veux changer la valeur de ce champ. Et il faut que l'objet en question ait le champ en question. Normal.
    Le champ à editer s'appelle "defaultSizing" et est un Boolean, mais tu me fait douter je vais vérifier.

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Non, ce qu'ont te dit c'est que editedAttrib est de type Boolean, alors qu'il aurait du être de type com.client.keytus.models.domain.SubZone


    Pour faire un exemple simple


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    package sandbox;
     
    import java.lang.reflect.Field;
     
    public class Machin {
    	private Boolean leChamp;
     
    	public static void main(String[] args) throws NoSuchFieldException, SecurityException {
    		Machin machin = new Machin();
    		Field field = machin.getClass().getDeclaredField("leChamp");
    		Boolean value = Boolean.TRUE;
    		try {
    			field.set(value, value);// ton erreur
    		} catch (IllegalArgumentException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IllegalAccessException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} 
    		try {
    			field.set(machin, value);//ok
    			System.out.println("ok");
    		} catch (IllegalArgumentException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IllegalAccessException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} 
     
    	}
     
    }
    me sort
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    java.lang.IllegalArgumentException: Can not set java.lang.Boolean field sandbox.Machin.leChamp to java.lang.Boolean
    	at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:164)
    	at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:168)
    	at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:55)
    	at sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:75)
    	at java.lang.reflect.Field.set(Field.java:741)
    	at sandbox.Machin.main(Machin.java:13)
    ok

  5. #5
    Membre régulier
    Homme Profil pro
    Responsable SI (Toulouse)
    Inscrit en
    Juillet 2009
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable SI (Toulouse)

    Informations forums :
    Inscription : Juillet 2009
    Messages : 78
    Points : 122
    Points
    122
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Non, ce qu'ont te dit c'est que editedAttrib est de type Boolean, alors qu'il aurait du être de type com.client.keytus.models.domain.SubZone


    Pour faire un exemple simple


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    package sandbox;
     
    import java.lang.reflect.Field;
     
    public class Machin {
    	private Boolean leChamp;
     
    	public static void main(String[] args) throws NoSuchFieldException, SecurityException {
    		Machin machin = new Machin();
    		Field field = machin.getClass().getDeclaredField("leChamp");
    		Boolean value = Boolean.TRUE;
    		try {
    			field.set(value, value);// ton erreur
    		} catch (IllegalArgumentException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IllegalAccessException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} 
    		try {
    			field.set(machin, value);//ok
    			System.out.println("ok");
    		} catch (IllegalArgumentException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IllegalAccessException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} 
     
    	}
     
    }
    me sort
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    java.lang.IllegalArgumentException: Can not set java.lang.Boolean field sandbox.Machin.leChamp to java.lang.Boolean
    	at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:164)
    	at sun.reflect.UnsafeFieldAccessorImpl.throwSetIllegalArgumentException(UnsafeFieldAccessorImpl.java:168)
    	at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:55)
    	at sun.reflect.UnsafeObjectFieldAccessorImpl.set(UnsafeObjectFieldAccessorImpl.java:75)
    	at java.lang.reflect.Field.set(Field.java:741)
    	at sandbox.Machin.main(Machin.java:13)
    ok
    Exact ! Et tout d'abord merci je galère depuis hier sur un problème que je crois être de type alors qu'effectivement mon problème était lié au fait que je passait l'objet représentant l'attribut au lieu de l'objet parent de l'attribut :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    	f.set(parentObject ,  value);
    Encore merci j'aurais cherché encore longtemps...

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

Discussions similaires

  1. [VBA-E]Lancer une macro sur changement de valeur cellule ?
    Par jeremiegrenoble dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 07/03/2006, 14h22
  2. Réponses: 2
    Dernier message: 23/01/2006, 11h55
  3. Changement de valeur
    Par Anduriel dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 27/11/2005, 00h31
  4. Réponses: 1
    Dernier message: 29/09/2005, 11h10
  5. Intercepter le changement de valeur d'une variable
    Par Captain_JS dans le forum C++Builder
    Réponses: 5
    Dernier message: 07/01/2005, 08h04

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