Programming/JAVA

JAVA - Reflection API

잇(IT) 2023. 6. 1. 18:04

- Reflection API

1. 구체적인 클래스 타입을 알지 못해도 그 클래스의 정보(메서드, 타입, 변수 등등)에 접근할 수 있게 해주는 자바 API다.

 

- Car 클래스 구현

public class Car {
    private final String name;
    private int position;

    public Car(String name, int position) {
        this.name = name;
        this.position = position;
    }

    public void move() {
        this.position++;
    }

    public int getPosition() {
        return position;
    }
}

 

- 다형성을 통한 객체 생성

public static void main(String[] args) {
    Object obj = new Car("foo", 0);
}

1. obj의 경우 Car의 조상이기 때문에 다형성의 성격을 통해 객체를 생성 가능하지만 Car 클래스에 있는 메서드들은 사용할 수 없다.

 

- Reflection API를 활용하여 Car 클래스의 move 메서드 호출

public static void main(String[] args) throws Exception {
    Object obj = new Car("foo", 0);
    Class carClass = Car.class;
    Method move = carClass.getMethod("move");

    // move 메서드 실행, invoke(메서드를 실행시킬 객체, 해당 메서드에 넘길 인자)
    move.invoke(obj, null);

    Method getPosition = carClass.getMethod("getPosition");
    int position = (int)getPosition.invoke(obj, null);
    System.out.println(position);
    // 출력 결과: 1
}

1. Reflection API를 통해 클래스 Car 타입을 알지 못해도 move 메서드에 접근했다.

Class carClass2 = Class.forName("Car");

2. 클래스의 이름만으로도 해당 클래스의 정보를 가져올 수 있다.

3. 다시 말해서 Reflection API는 클래스의 이름만 가지고도 생성자, 필드, 메서드 등등 해당 클래스에 대한 거의 모든 정보를 가져올 수 있다.

 

- Spring Framework에서도 Reflection API를 사용하는데 대표적으로 Spring Container의 BeanFactory가 있다. Bean은 애플리케이션이 실행한 후 런타임에 객체가 호출될 때 동적으로 객체의 인스턴스를 생성하는데 이때 Spring Container의 BeanFactory에서 리플렉션을 사용한다.

- Spring Data JPA 에서 Entity에 기본 생성자가 필요한 이유도 동적으로 객체 생성 시 Reflection API를 활용하기 때문이다. Reflection API로 가져올 수 없는 정보 중 하나가 생성자의 인자 정보이다. 그래서 기본 생성자가 반드시 있어야 객체를 생성할 수 있는 것이다. 기본 생성자로 객체를 생성만 하면 필드 값 등은 Reflection API로 넣어줄 수 있다.

 

 

 

 

 

 

 

 

 

 

 

* 출처 : https://tecoble.techcourse.co.kr/post/2020-07-16-reflection-api/

728x90

'Programming > JAVA' 카테고리의 다른 글

JAVA - 열거형  (0) 2023.06.07
JAVA - Optional  (0) 2023.06.05
JAVA - 람다 (기본)  (0) 2023.05.18
JAVA - 컬렉션 프레임 워크 (Collections Framework), List, Set, Map ... (1) 그 중 List  (0) 2023.05.18
JAVA - Reflection  (1) 2023.05.14