리플렉션이란?
- reflect: 반사하다, 비치다
- 거울에 반사된 고양이가 있다고 가정하자.
- 여기서 고양이는 '클래스', 거울에 반사된 고양이는 'JVM 메모리 영역의 정보'에 해당
- 정의: 런타임에 클래스와 인터페이스 등을 검사하고 조작할 수 있는 기능
컴파일 타임과 런타임
리플렉션 다시보기
- 프로그램 실행 중에 사용자와 운영체제 및 기타 프로그램과 상호작용하면서 클래스와 인터페이스 등을 검사하고 조작할 수 있는 기능
리플렉션 동작 원리
- Class: 메서드 영역의 클래스 및 인터페이스 정보를 가져오는 클래스
- 리플렉션으로 어떤 정보를 얻을 수 있는가?
- 필드
- 메서드
- 생성자
- Enum
- Annotation
- 배열
- 부모 클래스와 인터페이스
필요한 값 가져오기
|
참조범위 |
접근제어자 |
getXXXs |
자신과 상위 클래스 |
public만 |
getDeclaredXXXs |
자신 |
모두 |
리플렉션 사용법
class MyClass {
private final String name = "제로";
}
public class Main {
public static void main(String[] args) throws Exception {
final Class<MyClass> clazz = MyClass.class;
final Field declaredField = clazz.getDeclaredField("name");
declaredField.setAccessible(true);
final MyClass myClass = new MyClass();
final String name = (String) declaredField.get(myClass);
System.out.println("name = " + name);
}
}
리플렉션의 단점
- 보안 취약점
- 코드 복잡도 증가
- 성능 저하
- 최적화 방해
- 타입 안정성
- 호환성
리플렉션을 사용해야하는가? vs 사용하지 말아야하는가?
- 프레임워크 및 라이브러리 제공자: 런타임에 사용자와 상호작용하면서 기능을 제공하고 싶은 경우 한정적으로 사용
- 일반 사용자: 되도록이면 사용을 지양. 정말 필요한 곳에서만 적절하게 사용. 리플렉션으로 인한 피해는 모두 사용자 책임
참고