4.5.2 객체 조사
앞에서 살펴보았듯이 객체에 속한 필드의 타입과 이름을 기술하는 Field 객체를 얻을 수 있다. Field 객체를 이용하면 지정한 필드를 가진 객체의 필드 값에 접근할 수 있다.
예를 들어 다음 코드는 객체에 속한 모든 필드의 내용을 나열하는 방법이다.
Object obj = ...;
for (Field f : obj.getClass().getDeclaredFields()) {
f.setAccessible(true);
Object value = f.get(obj);
System.out.println(f.getName() + ":" + value);
}
핵심은 필드 값을 읽어 오는 get 메서드다. get 메서드는 필드 값이 기본 타입 값이면 래퍼 객체를 반환한다. 이 경우 get 대신 getInt, getDouble 등 메서드를 호출해 실제 값을 얻어 올 수도 있다.
Note ≣
비공개 Field와 Method 객체를 사용하려면 먼저 객체를 ‘접근 가능하게’ 만들어야 한다. setAccessible(true)를 호출하면 해당 필드 또는 메서드를 리플렉션용으로 ‘잠금 해제’한다. 하지만 모듈 시스템이나 보안 관리자가 해당 요청을 막고 이 방식으로 객체에 접근하지 못하게 보호할 수도 있다. 이때 setAccessible 메서드는 InaccessibleObjectException이나 SecurityException을 일으킨다. 필드나 메서드에 접근할 수 없는 경우 false를 반환하는 trySetAccessible 메서드를 호출하는 방법도 있다.