본문 바로가기
GD's IT Lectures : 기초부터 시리즈/자바(JAVA) 기초부터 ~

[자바(JAVA)] Reflection API

by GDNGY 2023. 4. 28.

21. Reflection API

21.1. 리플렉션 개념

자바 Reflection API는 실행 중인 자바 애플리케이션에서 클래스, 메서드, 필드 등의 정보를 분석하고 조작할 수 있는 기능을 제공합니다. 이는 컴파일 시간에는 알 수 없는 클래스와 그 클래스의 멤버들에 접근할 수 있는 방법을 제공합니다. Reflection API는 다양한 자바 라이브러리 및 프레임워크에서 사용되며, 특히 자바 프레임워크의 핵심 기능 중 하나인 스프링 프레임워크에서도 중요한 역할을 합니다

 

21.2. Class 클래스

Reflection API에서 핵심적인 클래스는 java.lang.Class입니다. Class 클래스는 JVM에서 로드된 클래스의 정보를 제공합니다. 즉, 클래스의 이름, 패키지, 메서드, 필드 등의 정보를 알 수 있습니다. 다음은 Class 클래스의 주요 메서드입니다.

public class MyClass {
  private int myField;
  public void myMethod() {
    // ...
  }
}

Class<MyClass> clazz = MyClass.class;
String className = clazz.getName(); // "MyClass"
Package pkg = clazz.getPackage(); // "com.example"
Field field = clazz.getDeclaredField("myField");
Method method = clazz.getDeclaredMethod("myMethod");

 

21.3. 메서드, 필드, 생성자 정보 조회

Reflection API를 사용하면 클래스의 메소드, 필드, 생성자 등의 정보를 동적으로 조회할 수 있습니다.

Class<?> clazz = MyClass.class;

// 모든 메소드 조회
Method[] methods = clazz.getDeclaredMethods();

// 특정 메소드 조회
Method myMethod = clazz.getDeclaredMethod("myMethod");

// 모든 필드 조회
Field[] fields = clazz.getDeclaredFields();

// 특정 필드 조회
Field myField = clazz.getDeclaredField("myField");

// 모든 생성자 조회
Constructor<?>[] constructors = clazz.getDeclaredConstructors();

// 특정 생성자 조회
Constructor<?> myConstructor = clazz.getDeclaredConstructor(String.class, int.class);

 

21.4. 동적 객체 생성 및 메소드 호출

Reflection API를 사용하면 클래스의 생성자를 호출하여 동적으로 객체를 생성할 수 있습니다. 또한, 객체의 메서드를 동적으로 호출할 수도 있습니다.

Class<?> clazz = MyClass.class;

// 생성자를 호출하여 객체 생성
Constructor<?> constructor = clazz.getDeclaredConstructor();
MyClass instance = (MyClass) constructor.newInstance();

// 메소드 호출
Method method = clazz.getDeclaredMethod("myMethod");
method.invoke(instance);


위의 코드에서는 MyClass 클래스의 기본 생성자를 호출하여 객체를 생성하고, myMethod 메소드를 호출합니다. 이와 같은 Reflection API의 활용은 다양한 자바 라이브러리 및 프레임워크에서 사용되며, 특히 자바 프레임워크의 핵심 기능 중 하나인 스프링 프레임워크에서도 중요한 역할을 합니다.


예를 들어, 스프링 프레임워크에서는 자바 객체를 생성하고 관리하는데 Reflection API를 활용합니다. 스프링은 애플리케이션의 설정 정보를 기반으로 자바 객체를 생성하고, 객체 간의 의존성을 자동으로 관리합니다. 이를 위해 스프링은 Reflection API를 사용하여 클래스의 생성자 및 프로퍼티를 동적으로 조회하고, 자동으로 객체를 생성하고 의존성을 주입합니다.

 

아래는 스프링의 예시입니다.

public class MyService {
  private MyRepository repository;
  public MyService(MyRepository repository) {
    this.repository = repository;
  }
  // ...
}

public class MyRepository {
  // ...
}

ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
MyService service = context.getBean(MyService.class);

위 코드에서는 스프링 애플리케이션 콘텍스트에서 MyService 클래스의 인스턴스를 생성합니다. 이를 위해 스프링은 MyService 클래스의 생성자에서 MyRepository 클래스의 인스턴스를 주입합니다. 이때 Reflection API를 사용하여 생성자 및 프로퍼티를 동적으로 조회합니다.


Reflection API를 사용하는 것은 런타임 시에 클래스 및 멤버 정보를 동적으로 가져오고 조작할 수 있다는 장점이 있습니다. 그러나 이는 성능상의 이슈가 있을 수 있으며, 컴파일 시간에 미리 알 수 있는 정보를 사용하는 것이 좋습니다. 또한 Reflection API는 private 멤버에 대한 접근도 가능하기 때문에, 보안 문제가 발생할 수 있습니다. 따라서 Reflection API의 사용은 신중하게 결정해야 합니다.

반응형

댓글