- 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/
'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 |