ETC
[10분 테코톡] 헙크의 자바 Reflectio
버스는그만
2023. 8. 6. 19:57
리플렉션이란?
- 어원: 반사하다, 비치다
- 런타임에 클래스와 인터페이스 등을 검사하고 조작할 수 있는 기능
동작원리
- java 파일이 class 파일로 바뀌면서 컴파일러가 컴파일 후 바이트 코드가 된다.
- 메서드 에어리어 클래스에 대한 메타 정보가 들어간다. 이 메서드 에어리어에 메타데이터를 가지고 클래스를 검사하고 조작하는 기능을 리플렉션이다.
사용방법
Class
- 메서드 영역의 클래스 및 인터페이스 정보를 가져오는 클래스
- 이 클래스를 통해서 아래와 같이 3가지 방법을 통해 인스턴스를 생성할 수 있다.
public static void main(String[] args) throws ClassNotFoundException {
// 1
final Class<MyClass> class1 = MyClass.class;
// 2
final MyClass o = new MyClass();
final Class<? extends MyClass> class2 = o.getClass();
// 3
final Class<?> class3 = Class.forName("com.example.MyClass");
}
- 클래스 타입.class
- 인스턴스.getClass()
- Class.forName('패키지 경로')
리플렉션으로 어떤 정보를 가져올 수 있을까?
- 필드
- 메서드
- 생성자
- enum
- Annotation
- 배열
- 부모 클래스와 인터페이스
이번편에서는 필드, 메서드, 생성자만 다룬다.
참조 범위 | 접근 제어자 | |
getXXXs | 자신과 상위 클래스 | public만 |
getDeclaredXXXs | 자신 | 모두 |
- getXXXs : 해당 클래스와 상위 클래스에 있는 public 요소들만 가져옴
- getDelaredXXXs : 접근 제한자와 상관 없이 해당 클래스의 모든 요소를 가져옴
단, private 한 필드, 메서드에 접근할 경우 해당 객체의 setAccessable(true) 해줘야한다.
리플렉션과 전략 패턴 활용
public static void main(String[] args) throws Exception {
final Class<?> class1 = Class.forName(args[0]);
final Constructor<?> constructor = class1.getDeclaredConstructor();
final MyClass myClass = (MyClass) constructor.newInstance();
System.out.println(myClass.getName());
}
위와 같이 환경 변수를 통해서 if 문 없이 전략 패턴을 사용할 수 있다.
리플렉션의 단점
- 보안 취약점
- 코드 복잡도 증가
- 성능 저하
- 최적화 방해
- 타입 안정성
- 호환성
마무리
리플렉션을 사용하면 OOP의 개념을 지킬 필요 없는 것이 아닌가?
후기
정말 간단히만 알아본 것이고 리플렉션은 앞으로 더 많이 알아봐야겠다.
참고자료
[10분 테코톡] 헙크의 자바 Reflection