뭔가를 분명히하고 싶습니다.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 객체 자체를 반환 할 수 있다는 것을 알고 있습니다. 누군가 어떻게 이런 일이 일어날 지 생각하고 있습니까? 당신은 구아바는 후드 아래에 무엇을하고 있는지 아마 표준 자바 반사를 사용하여 개인 필드에 반영 할 수
내가 완전히 확실하지 않다하지만 필드 필드 = MyClass에'노력이 귀하의 개인 필드를 액세스 할 수 있도록한다. class.getDeclaredField ("field1");'? 이것은 차이가있을 수 있습니다 ... – user219882
예, 그 유일한 문제는 getDeclaredField가 어떤 조상도 아닌 클래스에 의해 선언 된 필드 만 제공한다는 것입니다. 나는 (조상을 통해 반복하는) 문제를 우회하는 방법을 보았지만, 지루한 상용구 코드를 작성하는 것 같았다. ... – Sergio
이 질문은 구아바와 관련이 없기 때문에 "구아바"는 꼬리말을 붙이지 않았다. –