inblog logo
|
LHS's Study Space
    스프링부트

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

    lhs's avatar
    lhs
    Nov 14, 2024
    [스프링 부트] 1. 리플렉션(Reflection)
    Contents
    1. 리플렉션이란?2. 주요 클래스3. 주요 기능
    💡
    리플렉션(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
    Contents
    1. 리플렉션이란?2. 주요 클래스3. 주요 기능

    LHS's Study Space

    RSS·Powered by Inblog