티스토리 뷰
Java 리플렉션(Reflection)
- 런타임에 클래스를 조사하고 조작할 수 있는 기능
- 리플렉션을 사용하면 클래스, 메소드, 필드 등의 정보를 런타임에 동적으로 가져오거나 수정할 수 있음.
- 컴파일 타임에 알 수 없는 클래스의 정보를 다루거나, 동적으로 객체를 생성하고 메소드를 호출하는 데 유용
- Shallow Reflection은 주로 공용 멤버에 대한 접근과 조작을 제공하는 일반적인 리플렉션
- Eeep Reflection : java 리플렉션의 확장된 형태로, 비공개 멤버, 상속된 멤버, 내부 클래스 등 일반적인 리플렉션으로 접근하기 어려운 부분에 접근하고 조작 가능 -> field.setAccessible(true);
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class ReflectionExample {
public static void main(String[] args) throws Exception {
// 클래스 정보 얻기
Class<?> clazz = Class.forName("com.example.MyClass");
System.out.println("Class name: " + clazz.getName());
// 생성자 접근 및 객체 생성
Constructor<?> constructor = clazz.getConstructor(String.class);
Object instance = constructor.newInstance("Hello");
// 필드 접근 및 수정
Field field = clazz.getDeclaredField("myField");
field.setAccessible(true); // 접근 제어 무시
field.set(instance, "New Value");
System.out.println("Field value: " + field.get(instance));
// 메소드 호출
Method method = clazz.getDeclaredMethod("myMethod", String.class);
method.setAccessible(true);
method.invoke(instance, "Hello");
// 애노테이션 접근
if (clazz.isAnnotationPresent(MyAnnotation.class)) {
MyAnnotation annotation = clazz.getAnnotation(MyAnnotation.class);
System.out.println("Annotation value: " + annotation.value());
}
}
}
장점
- 동적 클래스 로딩: 런타임에 클래스를 로드하고 사용할 수 있어 유연성을 높임
- 라이브러리 및 프레임워크 개발: 리플렉션을 사용하면 범용 라이브러리나 프레임워크에서 특정 클래스의 메소드나 필드를 동적으로 호출할 수 있음.
- 테스트 및 디버깅 도구: 테스트 프레임워크는 리플렉션을 사용하여 테스트 메소드를 자동으로 검색하고 실행할 수 있음.
단점
- 성능 저하: 리플렉션은 일반 메소드 호출보다 느림. 많은 리플렉션 사용은 성능에 영향을 줄 수 있음.
- 안전성: 컴파일 타임에 타입 검사를 할 수 없어 런타임 오류가 발생할 가능성이 높아짐.
- 가독성: 리플렉션 코드는 일반 코드보다 이해하기 어려울 수 있음
'IT > Java' 카테고리의 다른 글
JAVA 9 변경 사항들 (0) | 2024.08.06 |
---|---|
[JAVA] JPMS 자바 플랫폼 모듈 시스템이란 (0) | 2024.07.10 |