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
반응형
'JAVA > BASIC' 카테고리의 다른 글
자바(Java) 가변인자 - Main메소드 매개변수 String[] args를 가변인자로 받아보기 (0) | 2023.04.12 |
---|---|
자바(JAVA) 중첩클래스 - 로컬클래스와 익명객체의 로컬변수의 사용제한 (0) | 2023.04.11 |
자바(JAVA) Exception 예외처리에서 Try Catch 구문의 Finally의 필요성 (0) | 2023.04.10 |
자바(JAVA) 예외(Exception) Checked Exception과 UnChecked Exception (0) | 2023.04.10 |
자바 Object 클래스 객체복제 (얇은복제) (0) | 2023.04.10 |