JAVA - 리플렉션(Reflection)이란?

김도현·2024년 3월 4일

리플렉션(Reflection) 이란?

  • 리플렉션은 구체적인 클래스 타입을 알지 못하더라도 그 클래스의 메서드, 타입, 변수들에 접근할 수 있도록 해주는 자바API이다.
  • 컴파일 시간이 아닌 실행 시간에 동적으로 특정 클래스의 정보를 추출할 수 있는 프로그래밍 기법이다.

리플렉션 사용 시기

  • 동적으로 클래스를 사용해야할 때 필요하다.
  • 다시 말해 작성 시점에는 어떠한 클래스를 사용해야 할지 모르지만 런타임 시점에 클래스를 가져와서 실행해야하는 경우 필요하다.
  • 대표적으로 Spring 프레임워크의 애노테이션 같은 기능들이 리플렉션을 이용하여 프로그램 실행 도중에 동적으로 클래스의 정보를 가져와서 사용한다.

리플레션은 어떤 정보를 가져올 수 있을까

  • 아래와 같은 정보들을 가져올 수 있다.
    • Class
    • Constructor
    • Method
    • Field
  • 동적으로 클래스 정보를 얻거나, 인스턴스를 생성하고, 메서드를 호출하고, 필드에 접근하는 등의 작업을 할 수 있다. 이는 특시 프레임워크나 라이브러리를 개발할 때 유용하게 사용된다.

리플렉션의 단점

  • 리플렉션은 타입 안정성을 보장하지 않음
  • 성능 오버헤드가 발생할 수 있음
  • 코드의 복잡성을 증가 시킴

Reflection 예시

import java.lang.reflect.Method;

public class ReflectionExample {
    public static void main(String[] args) {
        try {
            // 클래스 이름으로 Class 객체를 가져옵니다.
            Class<?> clazz = Class.forName("java.util.ArrayList");
            
            // Class 객체를 사용하여 인스턴스를 생성합니다.
            Object instance = clazz.newInstance();
            
            // 인스턴스의 메소드를 가져와서 호출합니다.
            // 여기서는 ArrayList의 add 메소드를 예로 듭니다.
            Method method = clazz.getMethod("add", Object.class);
            method.invoke(instance, "Hello Reflection");
            
            // 인스턴스의 toString 메소드를 호출하여 결과를 출력합니다.
            Method toStringMethod = clazz.getMethod("toString");
            System.out.println(toStringMethod.invoke(instance));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

출처

https://kdg-is.tistory.com/entry/JAVA-%EB%A6%AC%ED%94%8C%EB%A0%89%EC%85%98-Reflection%EC%9D%B4%EB%9E%80

profile
Just do it

0개의 댓글