JAVA/BASIC

이것이 자바다 Reflection - newInstance() 및 ArgumentsConstrouctor 객체 생성법

유혁스쿨 2023. 4. 11. 17:58
728x90
반응형

 

Reflection 동적 객체 생성

Class 객체를 이용하면 new 연산자를 사용하지 않아도 동적으로 객체를 생성할 수 있다.

이 방법은 코드 작성 시에 클래스 이름을 결정할 수 없고, 런타임 시에 클래스 이름이 결정되는 경우에 매우 유용하게 사용한다.

아래 코드처럼 Class.forName() 메소드로 Class객체를 얻은 뒤 newInstance() 메소드를 호출하면 Object 타입의 객체를 얻을 수 있다.

 

public class Example {

    public static void main(String[] args) throws Exception {
        Class clazz = Class.forName("example.basic.Car");
        Object objCar = clazz.newInstance();
        objCar.number; // 접근할 수 없다.
    }
}

class Car {
	int number;
}

만약 해당 객체의 필드 혹은 메소드에 접근 하기 위해서는 생성하려는 객체의 클래스 타입으로 다음과 같이 강제 타입 변환을 해야한다.

public class Example {

    public static void main(String[] args) throws Exception {
        Class clazz = Class.forName("example.basic.Car");
        Car car = (Car)clazz.newInstance();
        int carNumber = car.number;
        System.out.println(carNumber);
    }
}

class Car {
	int number;
}

 

ArgumentsConstrouctor 객체 생성

 

매개변수가 있는 생성자를 통해 객체를 생성해본다.

책에는 언급만 되어있고 예시코드가 나와있지 않아서 다음과 같이 코드를 작성해보았다.

 

public class Example {

	public static void main(String[] args) throws Exception {
		Class<?> clazz = Class.forName("example.basic.Car");
		Constructor<?>[] constructor = clazz.getDeclaredConstructors();
		for (Constructor conArray : constructor) {
			Car a = (Car) conArray.newInstance(3);
			System.out.println("a = " + a);
		}
	}

}

class Car {
	int number;

	public Car(int number) {
		this.number = number;
	}

	@Override
	public String toString() {
		return "Car{" +
				"number=" + number +
				'}';
	}
}

Reflection을 통해 getDeclaredConstructors() 메소드를 활용하여 Constructor객체를 얻어 newInstance() 메소드를 호출하면 된다.

단, 이때 주의해야할 점은 해당 인스턴스의 클래스타입으로 강제 타입변환(다운캐스팅)을 진행해야만 한다.

일반적으로 newInstance()의 반환타입은 객체의 최고조상인 Object타입으로 반환되기 때문에 forName을 통해 접근하려는 클래스 객체의 Arguments Contstructor에 접근하기 위해서는 해당하는 객체의 클래스타입으로 타입변환을 해야한다!

728x90
반응형