2013-07-04 2 views
16

У меня есть метод:Как получить значение строки из поля 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, с помощью отражения?

+0

Не должно быть? 'System.out.println (" Имя поля: "+ field.getName());' –

+0

Да - вырезать ошибку 'вставить! –

+1

Вы хотите получить значение какого поля? На каком объекте? –

ответ

24

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

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

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

Это неудачный аспект API, который вам нужно передать в ссылке, даже если поле статично. – Owen

+9

Вы можете передать 'null'. –

+0

Удивительный, хороший момент. Я слишком долго пробыл от Java. – Owen

5

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

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

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

Просто ПОЛЕЗНЫЙ пример код для полого отражения:

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 
} 
Смежные вопросы