Reflaction은 런타임에 클래스, 인터페이스의 필드, 메서드, 생성자를 검사하고 수정할 수 있는 기능이다.
Class<?> clazz = User.class;
Method method = clazz.getDeclaredMethod("getName");
Object result = method.invoke(user);Class 객체
JVM이 User 클래스를 로딩하면 해당 클래스의 메타데이터를 표현하는 Class<User> 객체가 존재한다.
Class<User> clazz = User.class;해당 객체에서는 다음과 같은 정보를 조회할 수 있다.
- 클래스명
- Modifier
- 생성자
- 필드
- 메서드
- 인터페이스
- 부모 클래스
- 어노테이션
// 컴파일 타임에 타입을 알 수 있음
Class<User> clazz = User.class;
// 이미 객체가 존재할 때 사용
User user = new User();
Class<?> clazz = user.getClass();
// 문자열을 통해 런타임에 클래스를 찾음, 가장 리플렉션스러운 방식
Class<?> clazz = Class.forName("com.example.User");리플렉션 활용 대표 예시
- 동적 클래스 로딩
- 테스트 자동화 및 프레임워크 개발
- 객체 직렬화/역직렬화
- 의존성 주입
리플렉션은 프레임워크나 라이브러리가 사용자 코드를 미리 알 수 없을 때 주로 사용한다.
- Spring DI, Spring Annotation 기반 프로그래밍, Spring AOP
- Hibernate의 동적 객체-테이블 매핑
- JUnit의 테스트 케이스를 동적으로 로드하고 실행
리플렉션의 단점
- 타입 안정성 저하
- 코드가 복잡도 증가 및 가독성 저하
- 성능 저하
