-
자바의 리플렉션은 구체적인 타입을 알지 못해도 그 클래스의 메서드, 타입, 변수 등을 접근할 수 있도록 해주는 자바 API이다.
좀 더 자세히 말하자면 자바에서 이미 로딩이 완료된 클래스에서 또 다른 클래스를 동적으로 로딩(Dynamic Loading) 하
여 생성자(Constructor), 필드, 메서드 등을 사용하고 변경하는 기법이다.
모든 클래스의 부모 클래스인 Object 타입으로 Car 클래스의 인스턴스는 담을 수 있지만 사용 가능한 메서드는
Object의 메서드와 변수들 뿐이고 car의 메서드는 사용할 수 없다.
위 예와 같이 구체적인 타입의 클래스를 모를 때 사용하는 것이 리플렉션이다.
그러면 구체적인 타입의 클래스를 모른다는 것은 언제 일까? 런타임에 지금 실행되고 있는 클래스를 가져와서
실행을 할 경우에는 어떤 타입의 클래스를 사용할지 알 수 없다. 이 경우 구체적인 타입의 클래스를 알 수 없다.
컴파일 시간(Compile Time)이 아니라 실행 시간(Run Time)에 동적으로 특정 클래스의 정보를 추출하는 것
왜 사용할까?
실행 시간에 다른 클래스를 동적으로 로딩하여 접근할 때, 클래스와 필드 메서드 등에 관한 정보를 얻어야 할 때
사용방법은?
리플렉션은 Class라는 Api로 사용이 가능하다. 클래스에 있는 필드나 상위 클래스, 클래스가 구현하는 인터페이스, 메소
드 목록 등을 모두 접근이 가능하다.
컴파일된 자바 닷 클래스 파일은 클래스 로더에 의해서 로딩되고 Class 타입의 인스턴스를 만들어서 힙에다
넣어주게 된다.
이러한 인스턴스는 클래스만 로딩해도 이러한 인스턴스가 만들어지고 사용할 수 있다. 그리고 인스턴스가 제공하는
여러 메서드들을 사용할 수 있다.
1. 타입을 가지고 가져오는 방법,
2. 클래스에 인스턴스가 있고 여기서 getClass를 통해 클래스 타입에 접근하는 방법,
3. 풀 패키지 경로를 입력해서 문자열로 클래스 타입에 접근하는 방법이 있다.
어떤 식으로든 클래스 인스턴스에 접근을 했다면
bookClass.getField()로 필드들을 가져온다거나 DeclaredFields로 모든 필드를 모두 가져올 수 있다.
혹은 setAccessible(true)로 접근 지시자를 무시하고 private 한 값까지 모두 가져올 수 있다.
'JAVA > Java' 카테고리의 다른 글
JAVA의 Comparable, Comparator를 알아보자 (0) 2020.04.13 자바의 다형성 이란? (0) 2020.03.30 자바의 추상 클래스와 인터페이스 (0) 2020.03.28 JVM (Java Virtual Machine) 의 구조 (0) 2020.02.22 Gradle 과 Maven 차이? (0) 2020.01.10