Java Reflection 기본
Class 클래스
java.lang.Class<T>
- 클래스(혹은 형식)에 대한 메타 데이터(이름, 생성자, 필드, 메서드)를 나타내는 객체
- 클래스 혹은 형식의 구조 및 정의에 대한 정보 가짐
- 리플렉션 API를 통해 접근하고 동적 조작
- JVM에서 실행 되는 모든 클래스, 인터페이스, 열거형, 배열, 기본형 등에 대해 Class 객체(Class literal) 존재
Class<MyTest> testClass = MyClass.class
Class<String> stringClass = String.class
클래스 메타 데이터
- 클래스 수준
- 생성자
- 호출 가능한 기본 생성자 및 다중 정의된 생성자의 매개변수
- 필드
- 메서드
- 이름, 매개변수 목록, 반환 자료 및 동적 호출
Class 클래스 객체
Object.getClass()
Class clazz = obj.getClass()
Class class = Class.forName("name")
- 만약 인스턴스없다면 클래스 로더 개입, 클래스 로딩 됨
런타임에 클래스 로드
static Class.forName(String className)
- 런타임에 클래스를 동적으로 로드하고 해당 클래스에 대한 Class 객체 반환
- JDBC 드라이버 로딩, Reflection 기반 동적 객체 생성
- 프레임워크에서 설정 파일 같은 것으로 지정한 클래스를 로드할 경우 유용
Class.forName() 동작 과정
- 매개변수로 전달된 클래스(FQCN, Fully Qualified Class Name)대한 .class 파일을 JVM Class path에서 검색
- 클래스 패스는 설정된 디렉토리나 JAR파일
- java - classpath, java -cp 명령으로 설정 가능
- 보통 CLASSPATH 환경변수로 설정
- IntelliJ 사용 시 자동 관리
- ClassLoader 클래스를 사용해 클래스를 로드하고 초기화
Java 클래스 로딩(파트2)
- 클래스 로딩 및 링킹 과정이 모두 런타임에 이루어짐
- 실행 성능 일부 저하될 수 있으나 높은 확장성과 유연성 제공
- 인터페이스만 맞으면 Runtime에 구현 클래스 결정안해도 됨
- 클래스 로더는 실행할 프로그램 코드를 네트워크로 수신하는 것도 가능
- 해석(Resolution)단계는 동적 바인딩(혹은 늦은 바인딩)을 지원할 목적으로 초기화 후로 지연될 수 있음
리플렉션
- Runtime에 클래스 메타 정보 얻는 방법
- Java기반 응용 프로그램이 작동하는 중간에 특정 클래스가 가진 생성자, 메서드, 필드, 어노테이션 등에 관한 정보를 알아내는 방법
- 단, 접근제어 무력화 시킴
- Class.getDeclaredContstructors()
- Class.getDeclaredFileds()
- Class.getDeclaredMethods()
- Java기반 모듈화 프로그래밍 지원
- 클래스 메서드 코드는 인스턴스와 별개로 존재
- 메서드 실행 시 인스턴스 필요
어노테이션과 리플렉션
- 리플렉션으로 클래스 내부의 어노테이션 체크해서...