본문 바로가기

[Java] Reflection을 이용하여 인스턴스 생성 및 필드 값 주입하기

by Ohmry 2022. 11. 3.

Java에서 Reflection을 이용하여 클래스의 인스턴스를 생성하고, 인스턴스안에 있는 필드에 값을 추가하는 방법은 아래와 같습니다. 예를 들어 아래와 같이 Book 클래스가 있다고 가정할 때, 해당 클래스의 인스턴스를 생성하는 방법은 아래와 같습니다.

// Book.java
public class Book {
  String title;
  String author;
    
  public Book() {}
}

// Main
public static void Main(String[] args) {
  // 클래스에 대한 정보를 가져옵니다.
  Class<?> classType = Book.getClass();
  // 클래스에 선언된 기본 생성자 정보를 가져옵니다.
  Constructor<?> classConstructor = classType.getConstructor();
  // 가져온 기본 생성자를 통해 인스턴스를 생성합니다.
  Object classInstance = classConstructor.newInstance();
    
  assert classInstance instanceof Book;
}

위와 같이 생성한 인스턴스에 존재하는 필드에 값을 설정하는 방법은 아래와 같습니다.

// Book.java
public class Book {
  String title;
  String author;
    
  public Book() {}
  
  @Override
  public String toString() {
    return "{ title: " + title + ", author: " + author + "}";
  }
}

// Main
public static void Main(String[] args) {
  // 클래스에 대한 정보를 가져옵니다.
  Class<?> classType = Book.getClass();
  // 클래스에 선언된 기본 생성자 정보를 가져옵니다.
  Constructor<?> classConstructor = classType.getConstructor();
  // 가져온 기본 생성자를 통해 인스턴스를 생성합니다.
  Object classInstance = classConstructor.newInstance();
  
  // 클래스에 선언된 필드를 찾습니다.
  for (Field field : classType.getDeclaredFields()) {
    String fieldName = field.getName();
    
    // 필드의 이름을 모두 대문자로 변환한 값을 필드의 값으로 설정합니다.
    classType.getField(fieldName).set(classIntance, fieldName.toUpperCase());
  }
    
  assert classInstance instanceof Book;
  System.out.println(classInstance.toString());
}

댓글