리플렉션( **Reflection )**이란?

리플렉션은 구체적인 클래스 타입을 알지 못하더라도 그 클래스의 메서드, 타입, 변수들에 접근할 수 있도록 해주는 자바 API입니다.

쉽게 말해, 컴파일 시간이 아닌 실행 시간에 동적으로 특정 클래스의 정보를 추출할 수 있는 프로그래밍 기법입니다.

즉, 리플렉션을 사용하면 생성자, 메소드, 필드 등 클래스에 대한 정보를 아주 자세히 알아낼 수 있습니다.

대표적으로 여러 라이브러리, 프레임워크에서 사용되는 어노테이션이 리플렉션을 사용한 예시죠.

리플렉션을 사용하면 클래스와 메소드에 어떤 어노테이션이 붙어 있는지 확인할 수 있습니다.

자바 코드를 작성했다면 @Override 어노테이션을 한 번은 봤을겁니다. 실제로 어노테이션은 그 자체로는 아무 역할도 하지 않죠.

하지만 리플렉션 덕분에 우리가 스프링에서 @Component , @Bean 과 같은 어노테이션을 프레임워크의 기능을 사용하기 위해 사용할 수 있는 것입니다.

또한, 인텔리제이와 같은 IDE에서 Getter, Setter를 자동으로 생성해주는 기능도 리플렉션을 사용하여 필드 정보를 가져와 구현한다고 하죠.

이와 같이 리플렉션은 다양한 곳에서 무궁무진한 방법으로 사용될 수 있습니다.

그리고 신기한 점은 리플렉션을 사용하면 접근 제어자와 무관하게 클래스의 필드나 메소드도 가져와서 호출할 수 있다는 점입니다.

Class 클래스

리플렉션의 가장 핵심은 Class 클래스입니다. Class 클래스는 java.lang 패키지에서 제공되죠.

그럼 어떻게 특정 클래스의 Class 인스턴스를 획득할 수 있을까요?