반응형
자바의 Reflection API는 런타임에 클래스의 내부 정보를 탐색하거나 수정할 수 있게 해주는 기능이다.
컴파일 시점에 타입이 결정되는 것을 런타임 시점으로 연기할 수 있다.
주로 다이나믹 로딩, 테스트 자동화, 애너테이션 기반의 설정 등에서 사용된다.
사용 단계
클래스 정보 획득: 대상 클래스의 Class 객체를 획득한다.
Class<?> myClass = MyClass.class;
멤버 정보 탐색: 메서드, 필드, 생성자 등의 멤버 정보를 가져온다.
Method[] methods = myClass.getMethods(); Field[] fields = myClass.getFields();
동적 생성 및 접근: Class 객체를 이용해 동적으로 인스턴스를 생성하거나, 메서드를 호출하고, 필드에 접근한다.
Object obj = myClass.newInstance(); Method method = myClass.getMethod("myMethod"); method.invoke(obj);
애너테이션 처리
리플렉션 API를 사용해서 애너테이션 정보를 처리할 수 있다.
// 애너테이션 정의
public @interface MyAnnotation {
String value() default "default";
}
// 애너테이션 사용
@MyAnnotation("custom")
public class MyClass {
// ...
}
// 리플렉션을 이용한 애너테이션 처리
Class<?> myClass = MyClass.class;
if (myClass.isAnnotationPresent(MyAnnotation.class)) {
MyAnnotation myAnnotation = myClass.getAnnotation(MyAnnotation.class);
System.out.println("Annotation value: " + myAnnotation.value()); // Output: "Annotation value: custom"
}
제네릭 타입의 리플렉션
리플렉션 API는 제네릭 타입에 대한 정보를 제한적으로 제공한다. Java의 타입 소거 때문이다.
필드, 메서드, 클래스의 제네릭 타입 정도를 알 수 있다.
Field field = MyClass.class.getDeclaredField("myField"); // MyClass에 선언된 "myField"라는 이름의 필드 정보 가져오기
Type genericType = field.getGenericType(); // 제네릭 타입 정보 가져오기
활용 방안
Spring 프레임워크에서 컴포넌트 스캔을 할 때, 빈으로 등록할 클래스로 @Component, @Service 같은 애너테이션을 가진 클래스를 찾는다. 이때 리플렉션을 사용한다.
성능 문제와 대안
리플렉션은 런타임에 활용할 수 있는 유연성을 제공하지만, 성능에 부담을 주거나 보안 문제를 일으킬 수 있다.
리플렉션을 사용할 때 고려할 사항은 아래와 같다.
- 필요한 경우에만 사용하고, 가능하면 캐시를 이용해 반복적인 리플렉션 작업을 줄인다.
- 민감한 작업에는 리플렉션을 피하고, 컴파일 시점에 확인할 수 있는 방법을 사용한다.
반응형
'Tool > Java' 카테고리의 다른 글
[JPA] MultipleBagFetchException 이해하기 (1) | 2024.01.04 |
---|---|
[Spring] JPA 복합 키 사용하기 (0) | 2023.12.20 |
[Java] CUI 키오스크 (내일배움캠프 과제) (0) | 2023.10.20 |
[Java] Stream API 기초 정리 (0) | 2022.12.09 |