2012-04-13 3 views
2

뭔가를 분명히하고 싶습니다.Guava Reflection을 사용하는 비공개 필드에 대한 참조

"일반"Java 반사 기술 (라이브러리를 사용하지 않고) afaik에서는 개인 필드 (즉, java.lang.reflect.Field 객체, 필드 값 없음)에 대한 참조를 가져올 수 없습니다. 예를 들어

,이 클래스가있는 경우 :이 실행하려고하면

public class MyClass { 
    private String field1; 
} 

을 :

Field field = MyClass.class.getField("field1"); 

나는 NoSuchFieldException 예외를 얻을 것이다, 예상대로. Guava Reflection library

, 내가 이것을 실행하려고하면 :

Object o = new MyClass(); 
Property property = Properties.getPropertyByName(o, "field1"); 
Field f = property.getField(); 

나는 다음과 같은 예외 얻을 :

java.lang.IllegalStateException: Unknown property: field1 in class MyClass 

을 그리고이 또한 예상했다. 그러나 getter 메서드를 추가하면 다음과 같이됩니다.

public class MyClass { 
    private String field1; 
    public String getField1() {return field1;} 
} 

그러면 구아바 반사 코드가 작동합니다. 나는 이것에 관해 약간의 상실을 고백해야한다. 리플렉션 라이브러리는 getter를 사용하여 private 인스턴스 변수의 값을 반환하지만 getter가 있기 때문에 Field 객체 자체를 반환 할 수 있다는 것을 알고 있습니다. 누군가 어떻게 이런 일이 일어날 지 생각하고 있습니까? 당신은 구아바는 후드 아래에 무엇을하고 있는지 아마 표준 자바 반사를 사용하여 개인 필드에 반영 할 수

+1

내가 완전히 확실하지 않다하지만 필드 필드 = MyClass에'노력이 귀하의 개인 필드를 액세스 할 수 있도록한다. class.getDeclaredField ("field1");'? 이것은 차이가있을 수 있습니다 ... – user219882

+0

예, 그 유일한 문제는 getDeclaredField가 어떤 조상도 아닌 클래스에 의해 선언 된 필드 만 제공한다는 것입니다. 나는 (조상을 통해 반복하는) 문제를 우회하는 방법을 보았지만, 지루한 상용구 코드를 작성하는 것 같았다. ... – Sergio

+2

이 질문은 구아바와 관련이 없기 때문에 "구아바"는 꼬리말을 붙이지 않았다. –

답변

3

:

Class<?> c = ... some class ... 
Field field = c.getDeclaredField("name"); 
field.setAccessible(true); 
Object value = field.get(object); 

getDeclaredField는 개인 필드를 얻을 수 있습니다. 보안 문제를 방지하려면 setAccessible이 필요합니다.

어쨌든 최선의 방법은 가능한 경우 공개 자에게만 반영을 사용하는 것이므로 getter/setter를 사용하는 것이 좋습니다.

희망이 있습니다.

+0

감사합니다. 지금은 가능하지만 여전히 구아바보다 Field 객체에 대한 액세스가 getter의 존재에 달려 있습니다. – Sergio

+0

나는 구아바를 직접 사용하지는 않았지만 이것이 일어날 확률이 매우 높습니다 : Java에서 "속성"은 종종 접근 자/돌연변이 쌍 ("getName"및 "setName")을 기반으로하는 JavaBean 스타일 속성을 의미합니다.). "name"이라는 속성을 생성함으로써 구아바는 아마도 필드가 아닌 JavaBean 속성 규칙에 따라 접근 자/변형자를 찾고있을 것입니다. – Torious

+0

getDeclaredField의 문제는 조상 클래스가 선언 한 필드에 응답하지 않는다는 것을 깨달았습니다. – Sergio

1

FieldAccesibleObjectsetAccessible()이며 개인 필드의 값에 액세스 할 수 있습니다.

구아바 - 반사가 (이 라이브러리는 구아바는 별개이므로주의) Property.getFieldValue 같은 방법()

관련 문제