Reflection
- 구체적인 클래스 타입을 알지 못하더라도 그 클래스의 메서드, 타입, 변수들에 접근할 수 있도록 해주는 자바 API
- 컴파일 시간이 아닌 실행 시간(런타임 시점)에 동적으로 특정 클래스의 정보를 추출할 수 있는 프로그래밍 기법
정보
- Class
- Object.getClass()
- .class 리터럴
- Class.forName()
- Constructor
- getConstructor
- 매개변수 타임을 지정해주지 않으면 기본생성자 호출
- 생성자를 찾지 못한다면 NoSuchMethodException발생
- Method
- getMethod() 를 호출할때 인자로 생성자의 매개변수 타입을 바인딩
- 매개변수가 없는 메소드라면 메소드 명만 입력
- invoke()를 호출하여 메소드 실행
- Filed
- getField를 통해 클래스 필드 가져옴
- getField를 통해 클래스 필드 가져옴
- 필드값 변경은 set()
get, getDeclare
- get 접근제어자가 public인 것만 가져온다.
- getDeclare 접근제어자에 상관없이 모든것을 가져온다.
단점
- 보통 메소드를 호출하면 컴파일 시점에 분석하지만 리플렉션은 런타임단계에서 분석하므로 속도가 느리다.
- 타입 체크가 컴파일 타임에 불가능
- 객체의 추상화가 깨진다.
사용자가 실행할 때 발생하는 런타임 오류임으로 필요한 곳에서 한정적으로 사용하는게 좋다.