2013-07-04 2 views
16

내가하는 방법이 있습니다자바 필드에서 반사를 통해 문자열 값을 가져 오는 방법은 무엇입니까?

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

이 내가 같은 출력을 얻을 실행 : 지금은 반사를 사용하여 strValue, 로 실제 문자열 값을 추출 어떻게

Field name: java.lang.String 

를?

+0

'System.out.println ("필드 이름 :"+ field.getName()); ' –

+0

예 - 붙여 넣기 오류가 발생했습니다. –

+1

필드의 값을 가져 오시겠습니까? 어떤 물체에요? –

답변

24

클래스의 인스턴스에 대한 참조가 필요해 보입니다. get에 전화하여 참조를 전달하고 문자열로 반환을 캐스팅 할 수 있습니다.

다음과 같이 얻을 수 있습니다 : 이상적인 상황에서

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

필드가 정적 인 경우에도 참조를 전달해야하는 것은 API의 불행한 점입니다. – Owen

+9

'null'을 전달할 수 있습니다. –

+0

굉장하고 좋은 지적입니다. 나는 자바에서 너무 오래 떨어져있다. – Owen

5

Class 데이터를 보유하지 않습니다. 단순히 인스턴스의 구조와 동작에 대한 정보를 보유하고 있으며 Classes의 인스턴스를 사용하면 데이터를 사용할 수 있습니다. 따라서 extractStringFromField 메서드는 인스턴스를 전달하지 않으면 값을 추출 할 수 없습니다 (실제로 값을 추출하는 위치에서). 반사 필드

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

그냥 유용한 예제 코드 :

참조의 매개 변수의 이름, 당신은 값을 추출하기 위해 통과하는 경우

는 당신이 쉽게 당신이 울부 짖는 소리처럼 원하는 것을 얻을 수 instance입니다

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 
} 
관련 문제