리플렉션(Reflection) 이란?
- 리플렉션은 구체적인 클래스 타입을 알지 못하더라도 그 클래스의 메서드, 타입, 변수들에 접근할 수 있도록 해주는 자바API이다.
- 컴파일 시간이 아닌 실행 시간에 동적으로 특정 클래스의 정보를 추출할 수 있는 프로그래밍 기법이다.
리플렉션 사용 시기
- 동적으로 클래스를 사용해야할 때 필요하다.
- 다시 말해 작성 시점에는 어떠한 클래스를 사용해야 할지 모르지만 런타임 시점에 클래스를 가져와서 실행해야하는 경우 필요하다.
- 대표적으로 Spring 프레임워크의 애노테이션 같은 기능들이 리플렉션을 이용하여 프로그램 실행 도중에 동적으로 클래스의 정보를 가져와서 사용한다.
리플레션은 어떤 정보를 가져올 수 있을까
- 아래와 같은 정보들을 가져올 수 있다.
- Class
- Constructor
- Method
- Field
- 동적으로 클래스 정보를 얻거나, 인스턴스를 생성하고, 메서드를 호출하고, 필드에 접근하는 등의 작업을 할 수 있다. 이는 특시 프레임워크나 라이브러리를 개발할 때 유용하게 사용된다.
리플렉션의 단점
- 리플렉션은 타입 안정성을 보장하지 않음
- 성능 오버헤드가 발생할 수 있음
- 코드의 복잡성을 증가 시킴
Reflection 예시
import java.lang.reflect.Method;
public class ReflectionExample {
public static void main(String[] args) {
try {
// 클래스 이름으로 Class 객체를 가져옵니다.
Class<?> clazz = Class.forName("java.util.ArrayList");
// Class 객체를 사용하여 인스턴스를 생성합니다.
Object instance = clazz.newInstance();
// 인스턴스의 메소드를 가져와서 호출합니다.
// 여기서는 ArrayList의 add 메소드를 예로 듭니다.
Method method = clazz.getMethod("add", Object.class);
method.invoke(instance, "Hello Reflection");
// 인스턴스의 toString 메소드를 호출하여 결과를 출력합니다.
Method toStringMethod = clazz.getMethod("toString");
System.out.println(toStringMethod.invoke(instance));
} catch (Exception e) {
e.printStackTrace();
}
}
}
출처
https://kdg-is.tistory.com/entry/JAVA-%EB%A6%AC%ED%94%8C%EB%A0%89%EC%85%98-Reflection%EC%9D%B4%EB%9E%80