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;
}
}
위와 같이 Car 클래스가 있다고 하자
public static void main(String[] args) {
Object obj = new Car("foo", 0);
obj.move(); // 컴파일 에러 발생 java: cannot find symbol
}
public static void main(String[] args) throws Exception {
Object obj = new Car("foo", 0);
Class carClass = Car.class;
Method move = carClass.getMethod("move"); //try-catch 해주는것이 좋다(가독성 위해 생략)
// move 메서드 실행, invoke(메서드를 실행시킬 객체, 해당 메서드에 넘길 인자)
move.invoke(obj, null); //try-catch 해주는것이 좋다 (가독성 위해 생략)
}
실제 Car 객체를 굳이 Object 타입으로 생성해서 쓰는 일이 거의 없기 때문에 우리가 직접 코드를 작성할 때 Reflection을 쓸 일은 거의 없다.
나중에 추가될 클래스에 대한 기능을 미리 구현해야할 경우 Reflection을 써야함 (ex. annotation)
주로 활용되는 곳
💡 코틀린에서는 kotlin-jpa 라이브러리가 기본 생성자 만들어줌 (data class를 이용하자)