web-dev-qa-db-fra.com

Comment obtenir la valeur d'une chaîne à partir d'un champ Java via la réflexion?

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?

20
user1768830

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);
34
Owen

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);
5
Sazzadur Rahaman

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
}
1
Dmitry Knyazev