리플렉션은 구체적인 클래스 타입을 알지 못해도, 해당 클래스의 메소드나 타입, 변수 들에 접근할 수 있도록 해주는 자바 API이다.
리플렉션은 JVM이 클래스 로더를 통해 읽어온 클래스 정보(reflect된 정보)를 통해 접근한다.
리플렉션은 아래의 경우 사용한다.
- 특정 애노테이션이 붙어있 필드 또는 메소드를 읽어오기
- 특정 이름 패턴에 해당하는 메소드 목록 가져와 호출하기
- ...
예시
리플렉션을 사용하면 문자열로 클래스를 만들 수 있다. 아래의 코드를 보자.
Class<?> HelloClass = Class.forName("jaehoney.blogcode.Hello");
문자열(package name)를 사용해서 클래스 정보를 꺼내온다.
이후에 해당 클래스의 인스턴스를 만들 수도 있다.
Constructor<?> constructor = helloClass.getConstructor();
Hello hello = (Hello) constructor.newInstance();
해당 클래스로 예전에는 Class.newInstance()
메서드로 인스턴스를 만들 수 있었지만, 해당 방법은 현재는 권장되지 않는다.(deprecated)
현재는 생성자를 리플렉션으로 조회한 후 해당 생성자를 사용해서 인스턴스를 생성하는 방법이 권장된다.
이외에도 Class 인스턴스에는 아래의 메서드를 사용할 수 있다.
- getDeclaredMethod(String name, Class<?>... parameters) -> 해당 클래스의 메서드를 조회한다.
- getDeclaredMethods -> 해당 클래스의 모든 정의된 메서드를 조회한다.
- getDeclaredField -> 해당 클래스에 정의된 필드를 조회한다.
- getDeclaredAnnotations -> 해당 클래스의 애노테이션을 조회한다.
이러한 기능들을 통해서 해당 클래스가 가지고 있는 필드의 값을 조회하고 변경하는 것이 가능하다.
심지어 해당 필드나 메서드의 접근제어자가 private이라도 가능하다.
참고
'Language > Java' 카테고리의 다른 글
JVM - GC 알고리즘 알아보기! (feat. JDK 버전 별 Default) (0) | 2022.11.06 |
---|---|
Java - 배열(Array)을 사용할 때 주의해야 할 점! [+ 공변(Convaiant)] (0) | 2022.09.07 |
Effective Java - 추상 클래스와 인터페이스 차이 (0) | 2022.09.02 |
Effective Java - Comparable을 잘 구현하는 방법! (0) | 2022.09.01 |
Effective Java - try-finally 대신 try-with-resources 사용하기! (0) | 2022.08.31 |