728x90
리플렉션 정의
- 이미 로딩이 완료된 클래스에서 또 다른 클래스를 동적으로 로딩하여 생성자, 멤버필드, 멤버 메서드 등을 사용할 수 있게 하는 기능
- 클래스의 패키지 정보, 접근 지정자, 수퍼클래스, 어노테이션 등을 얻을 수 있음
- 컴파일 타임이 아니라 런타임에 동적으로 특정 클래스 의 정보를 객체화를 통해 분석 및 추출해줌
사용하는 이유
- 클래스와 메서드의 메타정보를 사용해서 어플리케이션을 동적으로 유연하게 만들 수 있음
- private 멤버도 Field.setAccessible() 메서드를 true로 지정하면 접근과 조작이 가능하게 만듬
리플렉션 시작
- 리플렉션의 시작은 Class<T>
Class<T>로 통한 접근방법
- 모든 클래스는 로딩한 다음에 Class<T> 인스턴스가 생기며, 모든 인스턴스는 getClass() 메소드를 가지게 됨
public class Book {
private String page;
private String name;
}
import java.util.Arrays;
public class ReflectionStudy {
public static void main(String[] args) {
Class<Book> bookClass = Book.class;
Arrays.stream(bookClass.getDeclaredFields()).forEach(System.out::println);
}
}
- 해당 클래스의 필드를 가져오는 예제이며, 메소드, 상위클래스, 인터페이스 등의 정보를 가져올 수 있음
주의사항
- 리플렉션은 런타임에 동작하기 때문에 컴파일 시점에서 오류를 잡기가 힘들어서 주의해야함 (컴파일 오류는 개발자가 즉시 확인, 런타임 오류는 실행할 때 발생하는 오류라 찾기가 힘듬)
- 위의 사유로 리플렉션은 일반적으로 사용안하는 것이 좋음 (컴파일 시점에 오류를 잡는 흐름에 역행하는 방식이라서)
리플렉션 사용 예
- 스프링 : 의존성 주입하는 경우, MVC에 넘어온 뷰를 객체에 바인딩 하는 경우 사용
- 하이버네이트 : @Entity 클래스에 Setter가 없을 경우 리플렉션을 사용
'JAVA' 카테고리의 다른 글
[JAVA] 람다표현식 (0) | 2022.01.01 |
---|---|
[JAVA] 제네릭 (0) | 2021.12.15 |
[JAVA] 데코레이터 패턴 (0) | 2021.12.10 |
[JAVA] 프록시패턴 (0) | 2021.12.09 |
[JAVA] ThreadLocal (0) | 2021.12.03 |