A voir également:
- [JAVA] Réinitialiser les champs d'une classe
- Reinitialiser pc - Guide
- Jeux java itel - Télécharger - Jeux vidéo
- Waptrick java football - Télécharger - Jeux vidéo
- Reinitialiser pc sans mdp - Guide
- Waptrick java voiture - Télécharger - Jeux vidéo
1 réponse
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à :)