Reflection(리플렉션)은 Java에서 클래스, 메서드, 필드 등의 정보를 실행 시간에 동적으로 조사하고 조작할 수 있게 해주는 기술입니다.
리플렉션을 사용하면 코드가 실행 중일 때에도 객체의 정보를 확인하거나 수정할 수 있습니다.
클래스 정보 확인
Class<?> clazz = MyClass.class;
System.out.println(clazz.getName()); // 클래스 이름 출력
필드 및 메서드 접근
Field field = clazz.getDeclaredField("privateField");
field.setAccessible(true); // private 필드 접근 허용
field.set(instance, "New Value"); // 값 설정
객체 생성
Constructor<?> constructor = clazz.getConstructor();
Object instance = constructor.newInstance(); // 객체 생성
메서드 호출
Method method = clazz.getMethod("sayHello");
method.invoke(instance); // 메서드 호출
유연성:
라이브러리와 프레임워크에서 활용:
성능 저하:
안전성 문제:
private
, protected
)를 무시할 수 있어 잘못 사용하면 코드 안정성을 해칠 수 있습니다.가독성 저하:
import java.lang.reflect.Field;
public class ReflectionExample {
private String hiddenField = "Hello, Reflection!";
public static void main(String[] args) throws Exception {
ReflectionExample example = new ReflectionExample();
// 클래스 정보 가져오기
Class<?> clazz = example.getClass();
// private 필드 접근
Field field = clazz.getDeclaredField("hiddenField");
field.setAccessible(true); // 접근 허용
System.out.println("Before: " + field.get(example));
// 필드 값 변경
field.set(example, "Modified Value");
System.out.println("After: " + field.get(example));
}
}
출력 결과:
Before: Hello, Reflection!
After: Modified Value
@Autowired
, @Service
등을 처리합니다.Reflection은 매우 강력한 도구이지만, 성능 저하와 안정성 문제를 야기할 수 있으므로 꼭 필요한 경우에만 사용해야 합니다. 일반적인 개발에서는 리플렉션을 사용하지 않고도 해결할 수 있는 방식(예: 생성자 주입, Getter/Setter 활용 등)을 우선 고려해야 합니다.