-
[Java] ReflectionProgramming Language/Java & Kotlin 2024. 12. 11. 20:45반응형
리플렉션이란?
- reflect: 반사하다, 비치다
- 거울에 반사된 고양이가 있다고 가정하자.
- 여기서 고양이는 '클래스', 거울에 반사된 고양이는 'JVM 메모리 영역의 정보'에 해당
- 정의: 런타임에 클래스와 인터페이스 등을 검사하고 조작할 수 있는 기능
컴파일 타임과 런타임
- 컴파일 타임: 스냅샷
- 런타임: 상호 작용
리플렉션 다시보기
- 프로그램 실행 중에 사용자와 운영체제 및 기타 프로그램과 상호작용하면서 클래스와 인터페이스 등을 검사하고 조작할 수 있는 기능
리플렉션 동작 원리
- Class: 메서드 영역의 클래스 및 인터페이스 정보를 가져오는 클래스
- 리플렉션으로 어떤 정보를 얻을 수 있는가?
- 필드
- 메서드
- 생성자
- Enum
- Annotation
- 배열
- 부모 클래스와 인터페이스
필요한 값 가져오기
참조범위 접근제어자 getXXXs 자신과 상위 클래스 public만 getDeclaredXXXs 자신 모두 리플렉션 사용법
class MyClass { private final String name = "제로"; } public class Main { public static void main(String[] args) throws Exception { final Class<MyClass> clazz = MyClass.class; final Field declaredField = clazz.getDeclaredField("name"); declaredField.setAccessible(true); final MyClass myClass = new MyClass(); final String name = (String) declaredField.get(myClass); System.out.println("name = " + name); } }
리플렉션의 단점
- 보안 취약점
- 코드 복잡도 증가
- 성능 저하
- 최적화 방해
- 타입 안정성
- 호환성
리플렉션을 사용해야하는가? vs 사용하지 말아야하는가?
- 프레임워크 및 라이브러리 제공자: 런타임에 사용자와 상호작용하면서 기능을 제공하고 싶은 경우 한정적으로 사용
- 일반 사용자: 되도록이면 사용을 지양. 정말 필요한 곳에서만 적절하게 사용. 리플렉션으로 인한 피해는 모두 사용자 책임
참고
- 우아한 테크톡 <자바 리플렉션>
반응형'Programming Language > Java & Kotlin' 카테고리의 다른 글
[JAVA] 추상 클래스와 인터페이스의 차이 (0) 2022.09.22 [JAVA & Kotlin] Java 메모리 구조 (JVM Memory Structure) (0) 2022.09.14 [Java] 리팩토링 할 때 고려할 사항들 (0) 2021.05.30 [Java] 람다식 (0) 2019.06.13 [Java] Enum 클래스 (0) 2019.04.18