J'ai une méthode:
public void extractStringFromField(Class<?> classToInspect) {
Field[] allFields = classToInspect.getDeclaredFields();
for(Field field : allFields) {
if(field.getType().isAssignableFrom(String.class)) {
System.out.println("Field name: " + field.getName());
// How to get the actual value of the string?!?!
// String strValue = ???
}
}
}
Lorsque cela fonctionne, j'obtiens une sortie comme:
Field name: Java.lang.String
Maintenant, comment extraire la valeur de chaîne réelle dans strValue
, en utilisant la réflexion?
Il semble que vous ayez besoin d'une référence à une instance de la classe. Vous voudriez appeler get et passer la référence, transtyper le retour en une chaîne.
Vous pouvez utiliser get comme suit:
String strValue = (String) field.get (objectReference);
Dans des situations idéales, Class
ne contient pas de données. Il contient simplement les informations sur la structure et le comportement de ses instances et les instances de Classes
contiennent vos données à utiliser. Ainsi, votre méthode extractStringFromField
ne peut pas extraire de valeurs à moins que vous ne passiez des instances (d'où elle extraira réellement des valeurs).
Si le nom du paramètre de la référence que vous passez pour extraire la valeur est instance
, vous pouvez facilement obtenir ce que vous voulez comme ci-dessous:
String strValue = (String)field.get(instance);
Exemple de code utile pour les champs de réflexion:
Field[] fields = InsanceName.getDeclaredFields();
for (Field field : fields) { //array for fields names
System.out.println("Fields: " + Modifier.toString(field.getModifiers())); // modyfiers
System.out.println("Fields: " + field.getType().getName()); //type var name
System.out.println("Fields: " + field.getName()); //real var name
field.setAccessible(true); //var readable
System.out.println("Fields: " + field.get(InsanceName)); //get var values
System.out.println("Fields: " + field.toString()); //get "String" values
System.out.println(""); //some space for readable code
}