Как получить значение строки из поля Java через отражение?

У меня есть метод:

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 = ???
        }
    }
}

Когда это выполняется, я получаю вывод, например:

Field name: java.lang.String

Теперь, как извлечь фактическое значение строки в strValue, с помощью отражения?

Ответы

Ответ 1

Похоже, вам нужна ссылка на экземпляр класса. Вы бы хотели называть get и передать ссылку, возвращая String.

Вы можете использовать get следующим образом:

String strValue = (String) field.get (objectReference);

Ответ 2

В идеальных ситуациях Class не хранит данные. Он просто содержит информацию о структуре и поведении своих экземпляров, а экземпляры Classes содержат ваши данные для использования. Таким образом, ваш метод extractStringFromField не может извлекать значения, если вы не передадите какие-либо экземпляры (откуда они будут фактически извлекать значения).

Если имя параметра ссылки, вы передаете для извлечения значение instance, то вы можете легко получить то, что хотите, как показано ниже:

String strValue = (String)field.get(instance);

Ответ 3

Просто используйте код примера для полей отражения:

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
}