리플렉션을 통해 Java에서 클래스의 공용 정적 최종 필드 / 속성 값 가져 오기


103

수업이 있다고 가정 해 보겠습니다.

public class R {
    public static final int _1st = 0x334455;
}

리플렉션을 통해 "_1 번째" 값을 어떻게 얻을 수 있습니까?


R._1st작동하지 않습니까? Android 개발에 대해 이야기하고 있다면 R수업이 항상 거기에 있다고 생각합니다 ...
Matthieu

@Matthieu 저도 그렇게 생각했습니다. 오늘까지 제가이 일을 똑같은 일을해야했을 때까지만 BR수업이있었습니다.
Sevastyan Savanyuk 2011

답변:


132

먼저 클래스의 필드 속성을 검색 한 다음 값을 검색 할 수 있습니다. 유형을 알고 있으면 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));
}...

감사. 시도했지만 작동하지 않았습니다. f.getInt (null) 오퍼레이션에서 예외가 발생합니다. 나는 그것을 잡았지만 어떻게 예외가 있습니까?
Viet

1
어떤 종류의 예외를 받았습니까?
M. Jessup

안녕하세요, 예외 e.getMessage ()는 필드 이름이 "_1st"이고 다른 것은 반환하지 않습니다.
Viet

1
그러나 예외 유형은 무엇입니까? (예 : NullPointerException, SecurityException, ...)
M. Jessup

2
문서 getInt()에 전달 된 인수 를 무시하는 언급이없는 이유 는 무엇입니까? 클래스의 인스턴스를 전달하기 위해 몇 시간을 보냈습니다.
Sevastyan Savanyuk 2011

70
 R.class.getField("_1st").get(null);

예외 처리는 독자를위한 연습으로 남겨집니다.

기본적으로 리플렉션을 통해 다른 필드와 마찬가지로 필드를 얻지 만 get 메서드를 호출 할 때 작업 할 인스턴스가 없기 때문에 null을 전달합니다.

이것은 최종 여부에 관계없이 모든 정적 필드에서 작동합니다. 필드가 공개되지 않은 setAccessible(true)경우 먼저 호출해야하며 물론 SecurityManager가이 모든 것을 허용해야합니다.


알았어. 내가 필요한 수업은 실제로 R.id였습니다. 당신의 도움을 주셔서 감사합니다!
Viet

1

나는 동일한 경로를 따르고 있었는데 (생성 된 R 클래스를 살펴본 후) Resources 클래스의 함수일 가능성이 끔찍하다고 느꼈습니다. 내가 맞았 어.

발견 : Resources :: getIdentifier

사람들이 시간을 절약 할 수 있다고 생각했습니다. 그들은 문서에서 낙담한다고 말하지만 그리 놀라운 것은 아닙니다.


그래서 당신은 그것이 안드로이드 질문이라고 추론했습니다. 태그에 표시되어야합니다 ...
Matthieu 2015

Android 질문이 아니라 특정 예제를 사용하는 Java 반영 질문입니다. 질문은 주제에 따라 태그가 지정됩니다.
Matthew 읽기
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.