수업이 있다고 가정 해 보겠습니다.
public class R {
public static final int _1st = 0x334455;
}
리플렉션을 통해 “_1 번째” 값을 어떻게 얻을 수 있습니까?
답변
먼저 클래스의 필드 속성을 검색 한 다음 값을 검색 할 수 있습니다. 유형을 알고 있으면 null로 get 메소드 중 하나를 사용할 수 있습니다 (정적 필드의 경우에만 실제로 정적 필드의 경우 get 메소드에 전달 된 인수가 완전히 무시 됨). 그렇지 않으면 getType을 사용하고 아래와 같이 적절한 스위치를 작성할 수 있습니다.
Field f = R.class.getField("_1st");
Class<?> t = f.getType();
if(t == int.class){
System.out.println(f.getInt(null));
}else if(t == double.class){
System.out.println(f.getDouble(null));
}...
답변
R.class.getField("_1st").get(null);
예외 처리는 독자를위한 연습으로 남겨집니다.
기본적으로 리플렉션을 통해 다른 필드와 마찬가지로 필드를 얻지 만 get 메서드를 호출 할 때 작업 할 인스턴스가 없기 때문에 null을 전달합니다.
이것은 최종 여부에 관계없이 모든 정적 필드에서 작동합니다. 필드가 공개되지 않은 setAccessible(true)
경우 먼저 호출해야하며 물론 SecurityManager가이 모든 것을 허용해야합니다.
답변
나는 동일한 경로를 따르고 있었는데 (생성 된 R 클래스를 살펴본 후) Resources 클래스의 함수일 가능성이 끔찍하다고 느꼈습니다. 내가 맞았 어.
발견 :
Resources :: getIdentifier
사람들이 시간을 절약 할 수 있다고 생각했습니다. 그들은 문서에서 낙담한다고 말하지만 그리 놀라운 것은 아닙니다.