[스프링 부트] 1. 리플렉션(Reflection)

lhs's avatar
Nov 14, 2024
[스프링 부트] 1. 리플렉션(Reflection)
💡
리플렉션(Reflection)은 Java에서 프로그램 실행 중에 클래스, 메서드, 필드 등의 정보를 동적으로 조회하고 수정할 수 있는 기능이다.
 

1. 리플렉션이란?

Reflection(리플렉션)은 Java에서 실행 중인 프로그램에 대해 클래스, 메서드, 필드 등의 정보를 동적으로 확인하고 조작할 수 있는 기능을 제공하는 기법이다. 이를 통해 컴파일 타임에 알 수 없는 객체의 메타데이터에 접근하거나, 객체의 타입을 알아내고 메서드나 필드에 동적으로 접근하여 호출할 수 있다. 리플렉션을 사용하면 클래스, 메서드, 필드의 구조에 대한 정보를 실행 중에 알 수 있으며, 이를 통해 동적 객체 생성, 메서드 호출, 필드 접근 등을 할 수 있다.

2. 주요 클래스

리플렉션의 주요 클래스는 java.lang.reflect패키지에 포함되어 있다.
  • Class: 클래스에 대한 메타데이터를 제공하는 클래스. 클래스 이름, 메서드, 생성자, 필드 등을 조회할 수 있다.
  • Method: 클래스의 메서드 정보를 제공하는 클래스. 메서드 이름, 반환 타입, 파라미터 타입 등을 확인하고, 메서드를 실행할 수 있다.
  • Field: 클래스의 필드 정보를 제공하는 클래스. 필드의 이름, 타입 등을 확인하고, 값을 읽거나 수정할 수 있다.
  • Constructor: 클래스의 생성자 정보를 제공하는 클래스. 생성자의 파라미터 타입 등을 확인하고, 객체를 생성할 수 있습니다.

3. 주요 기능

  1. 클래스 정보 조회
      • 리플렉션을 사용하면 클래스의 정보를 동적으로 조회할 수 있다. 예를 들어, 클래스 이름, 메서드 목록, 필드 목록 등을 실행 중에 알 수 있다.
      • 예제 코드
        • // Example 클래스의 Class 객체 얻는 4가지 방법 Class<?> clazz = Class.forName("Example"); Class<?> clazz = example.getClass(); Class<?> clazz = Example.class; ClassLoader classLoader = Example.class.getClassLoader(); Class<?> clazz = classLoader.loadClass("Example"); // 클래스의 이름 출력 System.out.println(clazz.getName()); // 클래스의 메서드 목록 출력 for (Method method : clazz.getDeclaredMethods()) { System.out.println(method.getName()); } // 클래스의 필드 목록 출력 for (Field field : clazz.getDeclaredFields()) { System.out.println(field.getName()); }
  1. 객체의 메서드 호출
      • 리플렉션을 사용하여 객체의 메서드를 동적으로 호출할 수 있다. 이때 메서드의 이름이나 매개변수를 알지 못하더라도 실행 중에 확인하여 호출할 수 있다.
      • 예제 코드
        • // 메서드 getDeclaredMethod()로 hello 메서드 찾기 Method greetMethod = clazz.getDeclaredMethod("hello", String.class); // private/protected 접근 제한 무시 greetMethod.setAccessible(true); // hello 메서드 호출 greetMethod.invoke(example, "World");
  1. 필드에 접근
      • 객체의 필드 값을 읽거나 수정할 수 있다. 일반적으로 필드는 private, protected 등의 접근 제어자가 적용되어 있어 외부에서 직접 접근할 수 없지만, 리플렉션을 사용하면 이러한 제약을 무시하고 접근할 수 있다.
      • 예제 코드
        • // 필드 name에 접근 Field nameField = clazz.getDeclaredField("name"); // private/protected 접근 제한 무시 nameField.setAccessible(true); // 필드 값 출력 System.out.println(nameField.get(example)); // 필드 값 수정 nameField.set(example, "New Name");
  1. 동적 객체 생성
      • 리플렉션을 사용하여 클래스의 이름을 통해 객체를 동적으로 생성할 수 있다.
      • 예제 코드
        • // 생성자 찾기 Constructor<?> constructor = clazz.getConstructor(String.class); // 생성자로 객체 생성 Object obj = constructor.newInstance("Hello, Reflection!");
Share article

LHS's Study Space