당신이 원하는 것을하기위한 언어 적 지원은 없습니다.
리플렉션을 사용하여 런타임에 유형의 멤버에 반사적으로 액세스 할 수 있습니다 (예 : Class.getDeclaredFields()
의 배열을 가져 오기 위해 with Field
). 그러나 수행하려는 작업에 따라 이것이 최상의 솔루션이 아닐 수도 있습니다.
또한보십시오
관련 질문
예
여기에 리플렉션이 할 수있는 일 중 일부만 보여주는 간단한 예가 있습니다.
import java.lang.reflect.*;
public class DumpFields {
public static void main(String[] args) {
inspect(String.class);
}
static <T> void inspect(Class<T> klazz) {
Field[] fields = klazz.getDeclaredFields();
System.out.printf("%d fields:%n", fields.length);
for (Field field : fields) {
System.out.printf("%s %s %s%n",
Modifier.toString(field.getModifiers()),
field.getType().getSimpleName(),
field.getName()
);
}
}
}
위의 스 니펫은 리플렉션을 사용하여 선언 된 모든 필드를 검사합니다 class String
. 다음 출력을 생성합니다.
7 fields:
private final char[] value
private final int offset
private final int count
private int hash
private static final long serialVersionUID
private static final ObjectStreamField[] serialPersistentFields
public static final Comparator CASE_INSENSITIVE_ORDER
효과적인 Java 2nd Edition, 항목 53 : 리플렉션보다 인터페이스 선호
다음은 책에서 발췌 한 것입니다.
주어진 Class
객체, 당신은 얻을 수 있습니다 Constructor
, Method
그리고 Field
클래스의 생성자, 메소드와 필드를 나타내는 경우. [그들은] 당신이 그들의 기본 대응 물을 반사적으로 조작 할 수있게합니다 . 그러나이 힘에는 대가가 따릅니다.
- 컴파일 타임 검사의 모든 이점을 잃게됩니다.
- 반사 액세스를 수행하는 데 필요한 코드는 서투르고 장황합니다.
- 성능이 저하됩니다.
일반적으로 런타임시 일반 애플리케이션에서 객체에 반사적으로 액세스해서는 안됩니다.
반영이 필요한 몇 가지 정교한 응용 프로그램이 있습니다. 예를 들어 [... 고의로 생략 됨 ...] 응용 프로그램이 이러한 범주 중 하나에 속하는지 여부에 대해 의문이 있다면 그렇지 않을 것입니다.