리플렉션은 구체적인 클래스 타입을 알지 못하더라도 그 클래스의 메서드, 타입, 변수들에 접근할 수 있도록 해주는 자바 API입니다.
쉽게 말해, 컴파일 시간이 아닌 실행 시간에 동적으로 특정 클래스의 정보를 추출할 수 있는 프로그래밍 기법입니다.
즉, 리플렉션을 사용하면 생성자, 메소드, 필드 등 클래스에 대한 정보를 아주 자세히 알아낼 수 있습니다.
대표적으로 여러 라이브러리, 프레임워크에서 사용되는 어노테이션이 리플렉션을 사용한 예시죠.
리플렉션을 사용하면 클래스와 메소드에 어떤 어노테이션이 붙어 있는지 확인할 수 있습니다.
자바 코드를 작성했다면 @Override
어노테이션을 한 번은 봤을겁니다. 실제로 어노테이션은 그 자체로는 아무 역할도 하지 않죠.
하지만 리플렉션 덕분에 우리가 스프링에서 @Component
, @Bean
과 같은 어노테이션을 프레임워크의 기능을 사용하기 위해 사용할 수 있는 것입니다.
또한, 인텔리제이와 같은 IDE에서 Getter, Setter를 자동으로 생성해주는 기능도 리플렉션을 사용하여 필드 정보를 가져와 구현한다고 하죠.
이와 같이 리플렉션은 다양한 곳에서 무궁무진한 방법으로 사용될 수 있습니다.
그리고 신기한 점은 리플렉션을 사용하면 접근 제어자와 무관하게 클래스의 필드나 메소드도 가져와서 호출할 수 있다는 점입니다.
리플렉션의 가장 핵심은 Class
클래스입니다. Class
클래스는 java.lang
패키지에서 제공되죠.
그럼 어떻게 특정 클래스의 Class
인스턴스를 획득할 수 있을까요?