Je ne parviens pas à obtenir la valeur du champ. Ce que j'essaie de faire, c'est d'obtenir l'objet au moment de l'exécution. S'il vous plaît laissez-moi savoir où je vais mal.
Test.class
import Java.lang.reflect.Field;
public class Test {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, SecurityException,
IllegalArgumentException, IllegalAccessException {
final Field field = Class.forName("com.logging.EX").getDeclaredField("value");
field.setAccessible(true);
field.get(Class.forName("com.logging.EX"));
}
}
Classe EX
public class EX {
private String value;
public EX(){
value="data";
}
/**
* @return the value
*/
public String getValue() {
return value;
}
/**
* @param value
* the value to set
*/
public void setValue(String value) {
this.value = value;
}
}
Quelque chose comme ça...
import Java.lang.reflect.Field;
public class Test {
public static void main(String... args) {
try {
Foobar foobar = new Foobar("Peter");
System.out.println("Name: " + foobar.getName());
Class<?> clazz = Class.forName("com.csa.mdm.Foobar");
System.out.println("Class: " + clazz);
Field field = clazz.getDeclaredField("name");
field.setAccessible(true);
String value = (String) field.get(foobar);
System.out.println("Value: " + value);
} catch (Exception e) {
e.printStackTrace();
}
}
}
class Foobar {
private final String name;
public Foobar(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
}
Vous pouvez également utiliser la méthode newInstance
de la classe pour obtenir une instance de votre objet au moment de l'exécution. Vous devrez tout d’abord définir cette variable d’instance, sinon elle n’aura aucune valeur.
Par exemple.
Class<?> clazz = Class.forName("com.something.Foobar");
Object object = clazz.newInstance();
Ou, où il a deux paramètres dans son constructeur, String et int par exemple ...
Class<?> clazz = Class.forName("com.something.Foobar");
Constructor<?> constructor = clazz.getConstructor(String.class, int.class);
Object obj = constructor.newInstance("Meaning Of Life", 42);
Ou vous pouvez l'interroger pour ses constructeurs au moment de l'exécution en utilisant clazz.getConstructors()
NB J'ai délibérément omis de projeter l'objet créé ici du type attendu, ce qui irait à l'encontre du but de la réflexion, car vous le sauriez déjà si vous le faites, ce qui éliminerait le besoin de réflexion première place.
Donc, ont la réponse ci-dessous. Cela fonctionne bien pour le moment. Pas sûr que ce soit le meilleur à suivre.
Votre classe de test:
public class Test {
public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, SecurityException,
IllegalArgumentException, IllegalAccessException, InstantiationException {
Field[] fields = Class.forName("com.logging.EX").newInstance().getClass().getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
System.out.println(field.getName() + " : " + field.get(Class.forName("com.logging.EX").newInstance()));
}
}
}
J'extrais tous les champs dans un tableau en appelant l'instance de com.logging.EX
, puis en parcourant tous les champs pour en extraire le nom et la valeur. N'a codé en dur aucun nom de champ ici.
Le mien pose peu de problèmes de sécurité car j'ai accédé à la variable avec le modificateur d'accès private
mais cela existe toujours avec la réflexion. Juste un disclaimer!
J'espère que cela t'aides!
Vous pouvez créer une instance à partir d'un objet de classe qui peut être utilisé dans field get value.
Class modelClass = Class.forName("com.gati.stackoverflow.EX");
final Field field = modelClass.getDeclaredField("value");
field.setAccessible(true);
Object modelInstance=modelClass.newInstance();
field.get(modelInstance);
Vous avez besoin de l'instance EX sur field.get ().
final Field field = Class.forName("com.logging.EX").getDeclaredField("value");
field.setAccessible(true);
field.get(new EX());