[JAVA] Réinitialiser les champs d'une classe
Fermé
jerome
-
12 avril 2005 à 12:16
Satrialien Messages postés 52 Date d'inscription mercredi 9 mars 2005 Statut Membre Dernière intervention 28 janvier 2006 - 12 avril 2005 à 16:31
Satrialien Messages postés 52 Date d'inscription mercredi 9 mars 2005 Statut Membre Dernière intervention 28 janvier 2006 - 12 avril 2005 à 16:31
A voir également:
- [JAVA] Réinitialiser les champs d'une classe
- Reinitialiser pc - Guide
- Waptrick java football - Télécharger - Jeux vidéo
- Jeux java itel football - Télécharger - Jeux vidéo
- Reinitialiser pc sans mdp - Guide
- Réinitialiser manette ps4 - Guide
1 réponse
Satrialien
Messages postés
52
Date d'inscription
mercredi 9 mars 2005
Statut
Membre
Dernière intervention
28 janvier 2006
13
12 avril 2005 à 16:31
12 avril 2005 à 16:31
Salut,
Alors oui ce moyen existe. Il faut récupérer la classe, et itérer sur les DeclaredFields, et les initialiser selon le type.
Un exemple vaut mieux qu'un grand discours :
Soit la classe qui possède des champs statiques suivante :
public class ClasseStatique
{
public static String prenom1="toto";
public static String prenom2="titi";
}
Soit maintenant la classe de test suivante qui veut initialiser les champs statiques de ClassesStatique :
public class Test2
{
public static void main(String[] args)
{
Field[] myFields = ClasseStatique.class.getDeclaredFields();
for(int i=0;i<myFields.length;i++)
{
Field myField = myFields[i];
try
{
System.out.println("traitement du champ "+myField.getName());
myField.set(null,"test");
}
catch (IllegalArgumentException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (IllegalAccessException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
Alors en fait ce qui se passe, c'est que tu récupères les champs déclarés de ta classe par la méthode getDeclaredFields() qui s'applique sur la classe. Tu peux aussi appeler la méthode getFields(), mais dans ce cas elle ne va pas te ramener que les champs propres à ta classe mais aussi tous ceux dont elle hérite éventuellement.
Ensuite, une chtite boucle sur le tableau renvoyé et tu récupère les champs un par un : ce qui t'es renvoyé est un objet de type Field. Cet objet permet de manipuler un champ d'une classe. La javadoc explique que tu peux récupérer (get) et positionner (set) la valeur d'un champ grâce à la méthode set(Object obj, Object value). Si le champ est un champ d'instance, alors tu fais : myField.set(monInstance,maValeur).
Par contre, un champ 'static' a justement la particularité de ne pas être lié à une instance, c'est tout son intérêt. Pour setter la valeur d'un tel champ, il suffit d'appeler la méthode avec le premier argument à null :
myField.set(null,maValeur)
Problème possible : ta classe possède des champs statiques ET des champs d'instance.
=>
public class ClasseStatique
{
//Champs statiques
public static String prenom1="toto";
public static String prenom2="titi";
//Champs d'instance
public String prenom3="tata";
}
Toi tu ne veux setter que les champs statiques, le reste tu t'en fous. Si tu appelles la méthode 'set' de 'Field' avec un premier argument null, tu vas te taper une jolie NullPointerException. Il suffit de la catcher comme ceci :
public class Test2
{
public static void main(String[] args)
{
Field[] myFields = ClasseStatique.class.getDeclaredFields();
for(int i=0;i<myFields.length;i++)
{
Field myField = myFields[i];
try
{
System.out.println("traitement du champ "+myField.getName());
myField.set(null,"test");
}
catch (IllegalArgumentException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (IllegalAccessException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch(NullPointerException e)
{
System.out.println("Le champ "+myField.getName()+" n'est pas statique, il est ignoré");
}
}
}
}
Enfin, dernier souci que tu peux rencontrer : dans les exemples, tous les champs sont des String, comment faire des champs de types différents ?
Le principe consiste à tester, une fois que tu as récupéré ton champ, son type, et de faire une initialisation propre à chaque type.
Avec la classe suivante :
public class ClasseStatique
{
public static String prenom="toto";
public static int age=3;
}
tu réalises le traitement ci-dessous :
import java.lang.reflect.Field;
public class Test2
{
public static void main(String[] args)
{
Field[] myFields = ClasseStatique.class.getDeclaredFields();
for(int i=0;i<myFields.length;i++)
{
Field myField = myFields[i];
try
{
System.out.println("traitement du champ "+myField.getName());
if(myField.getType().equals(String.class))
{
myField.set(null,"valeur par défaut pour les chaines");
}
if(myField.getType().equals(int.class))
{
myField.set(null,new Integer(0));
}
}
catch (IllegalArgumentException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (IllegalAccessException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch(NullPointerException e)
{
System.out.println("Le champ "+myField.getName()+" n'est pas statique, il est ignoré");
}
}
}
}
Voilà :)
Alors oui ce moyen existe. Il faut récupérer la classe, et itérer sur les DeclaredFields, et les initialiser selon le type.
Un exemple vaut mieux qu'un grand discours :
Soit la classe qui possède des champs statiques suivante :
public class ClasseStatique
{
public static String prenom1="toto";
public static String prenom2="titi";
}
Soit maintenant la classe de test suivante qui veut initialiser les champs statiques de ClassesStatique :
public class Test2
{
public static void main(String[] args)
{
Field[] myFields = ClasseStatique.class.getDeclaredFields();
for(int i=0;i<myFields.length;i++)
{
Field myField = myFields[i];
try
{
System.out.println("traitement du champ "+myField.getName());
myField.set(null,"test");
}
catch (IllegalArgumentException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (IllegalAccessException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
Alors en fait ce qui se passe, c'est que tu récupères les champs déclarés de ta classe par la méthode getDeclaredFields() qui s'applique sur la classe. Tu peux aussi appeler la méthode getFields(), mais dans ce cas elle ne va pas te ramener que les champs propres à ta classe mais aussi tous ceux dont elle hérite éventuellement.
Ensuite, une chtite boucle sur le tableau renvoyé et tu récupère les champs un par un : ce qui t'es renvoyé est un objet de type Field. Cet objet permet de manipuler un champ d'une classe. La javadoc explique que tu peux récupérer (get) et positionner (set) la valeur d'un champ grâce à la méthode set(Object obj, Object value). Si le champ est un champ d'instance, alors tu fais : myField.set(monInstance,maValeur).
Par contre, un champ 'static' a justement la particularité de ne pas être lié à une instance, c'est tout son intérêt. Pour setter la valeur d'un tel champ, il suffit d'appeler la méthode avec le premier argument à null :
myField.set(null,maValeur)
Problème possible : ta classe possède des champs statiques ET des champs d'instance.
=>
public class ClasseStatique
{
//Champs statiques
public static String prenom1="toto";
public static String prenom2="titi";
//Champs d'instance
public String prenom3="tata";
}
Toi tu ne veux setter que les champs statiques, le reste tu t'en fous. Si tu appelles la méthode 'set' de 'Field' avec un premier argument null, tu vas te taper une jolie NullPointerException. Il suffit de la catcher comme ceci :
public class Test2
{
public static void main(String[] args)
{
Field[] myFields = ClasseStatique.class.getDeclaredFields();
for(int i=0;i<myFields.length;i++)
{
Field myField = myFields[i];
try
{
System.out.println("traitement du champ "+myField.getName());
myField.set(null,"test");
}
catch (IllegalArgumentException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (IllegalAccessException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch(NullPointerException e)
{
System.out.println("Le champ "+myField.getName()+" n'est pas statique, il est ignoré");
}
}
}
}
Enfin, dernier souci que tu peux rencontrer : dans les exemples, tous les champs sont des String, comment faire des champs de types différents ?
Le principe consiste à tester, une fois que tu as récupéré ton champ, son type, et de faire une initialisation propre à chaque type.
Avec la classe suivante :
public class ClasseStatique
{
public static String prenom="toto";
public static int age=3;
}
tu réalises le traitement ci-dessous :
import java.lang.reflect.Field;
public class Test2
{
public static void main(String[] args)
{
Field[] myFields = ClasseStatique.class.getDeclaredFields();
for(int i=0;i<myFields.length;i++)
{
Field myField = myFields[i];
try
{
System.out.println("traitement du champ "+myField.getName());
if(myField.getType().equals(String.class))
{
myField.set(null,"valeur par défaut pour les chaines");
}
if(myField.getType().equals(int.class))
{
myField.set(null,new Integer(0));
}
}
catch (IllegalArgumentException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (IllegalAccessException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch(NullPointerException e)
{
System.out.println("Le champ "+myField.getName()+" n'est pas statique, il est ignoré");
}
}
}
}
Voilà :)