리플렉션(Reflection) 이란

image.png

리플렉션은 실체가 아닌 모습이 비추어져 있는 거울을 보고 기술을 사용하는 것. 즉, 프로그래밍 단에서는 구체적인 클래스 타입을 모르더라도 런타임 시점에서 해당 클래스의 메서드, 타입, 어노테이션을 알고 접근(메서드 호출, 조회, 변경 등)할 수 있도록 하는 프로그래밍 기법이다.

어플리케이션을 실행하면 작성한 자바 코드는 컴파일러에 의해 .class 형태의 바이트 코드로 변환되고, 이 정보들은 클래스 로더를 통해 JVM 메모리 영역에 저장된다. 그리고 클래스 정보를 통해 객체가 생성된다면 이는 JVM 힙 영역의 어딘가에 저장이 될테다. 이 놈들을 읽어 리플렉션은 클래스의 정보를 갖고온다.

리플렉션은 조회/수정/실행 모든 것을 가능케한다.

JinService 클래스를 불러와서 인스턴스를 생성할 뿐만 아니라 메서드, 멤버, 어노테이션 등에 접근하는 예시를 보자.

public class JinService {

    protected String name = "jin";
    private String company = "soma";

    private String say(String name) {
        return "Hello, " + name;
    }

    public String getName() {
        return name;
    }

}

먼저, 거울이 필요하다. Java는 Class 를 통해 클래스에 대한 거울을 보고 수정할 수 있도록 API를 제공한다. 여기서 Class는 흔히 말하는 클래스 키워드가 아님을 유의한다.

// 방법 1.
Class<?> jinServiceClass = Class.forName("inflearn.reflection.JinService");

// 방법 2.
Class<JinService> jinServiceClass = JinService.class;

// 방법 3.
JinService jinService = new JinService();
Class<? extends JinService> jinServiceClass = jinService.getClass();

image.png

이 거울을 통해 런타임 시점에서 클래스 내의 메서드를 확인해 호출하고, 필드, 어노테이션 등을 확인할 수 있다. 유의할 점은 리플렉션은 접근제어자를 무시할 수 있다는 것이다.

image.png

image.png

image.png

image.png