리플랙션
•
구체적인 클래스 타입을 알지 못해도 그 클래스의 메소드, 타입, 변수들을 접근할 수 있도록 해주는 자바 API
•
컴파일 시간이 아닌 실행 시간에 동적으로 특정 클래스의 정보를 추출해낼 수 있는 프로그램 기법
•
다양한 곳에 사용된다
◦
스프링 - DI에 사용
◦
MVC - View에서 넘어오는 데이터를 객체에 바인딩할 때 사용
◦
Hibernate - @Entity 클래스에 setter가 없으면 해당 필드에 값을 바로 주입
◦
JUnit - ReflectionUtils 라는 클래스를 내부적으로 정의하여 사용
•
단점
◦
느리다
▪
Reflection API는 컴파일 시점이 아니라 런타임 시점에서 클래스를 분석한다.
▪
JVM을 최적화할 수 없기 때문에 성능저하 발생
◦
런타임 시점에 클래스 정보를 알게 됨
▪
컴파일 시점에서 타입체크 기능을 사용할 수 없음
▪
에러 발생할 확률이 높아진다
◦
추상화 파괴, 불변성 파괴
▪
접근할 수 없는 필드나 메서드에도 reflection을 통해 접근할 수 있고 모든 클래스의 정보를 알게 된다.
필드 주입과 생성자 주입
•
Field Injection은 Bean이 생성된 이후 AutowiredAnnotationBeanPostProcessor의 processInjection() 메서드를 통해서 주입하게 된다.
•
생성자 주입은 field 주입과 다르게 빈 생성 때 사용되는 리플랙션 외에 추가적인 리플랙션을 사용하지 않는다