CS/Java

Reflection

leah-only 2025. 4. 24. 20:57

🪞Reflection(반사)이란?

객체를 통해 클래스의 정보를 분석하여 런타임에 클래스의 동작을 검사하거나 조작하는 프로그램 기법이다. 

클래스 파일의 위치나 이름만 있다면 해당 클래스의 정보를 얻어내고, 객체를 생성하는 것 또한 가능하게 해주어 유연한 프로그래밍을 가능케 해준다. 

 

 

reflection은 프레임워크, 라이브러리에서 많이 사용된다. (ex. JPA, Jackson, Mockito, IntelliJ 자동완성 기능)

왜냐하면 프레임워크, 라이브러리는 사용하는 사람이 어떤 클래스명과 멤버들을 구성할지 모르는데, 이러한 사용자 클래스들을 기존의 기능과 동적으로 연결시키기 위해 reflection을 사용한다고 보면 된다. 

대표적인 예로는 스프링의 DI(Dependencty Injection), Proxy, ModelMapper 등이 있다. 


Reflection 사용법

Class 객체 가져오기

// {클래스타입}.class
Class<?> class1 = Cat.class;

// {인스턴스타입}.class
Cat cat = new Cat("고양이");
Class<?> class1 = cat.getClass();

// Class.forName("전체도메인이름");
Class<?> class1 = Class.forName("org.example.Cat");

 

생성자 가져오기 

// getConstructor(...) : public 생성자만 가져옴
Constructor<Cat> constructor = class1.getConstructor(String.class); // String.class는 생성자의 매개변수 타입

// getDeclaredConstructor(...) : private 포함 모든 생성자 가져오기
Constructor<Cat> constructor = class1.getDeclaredConstructor(String.class);
constructor.setAccessible(true); // private이라면 접근 허용 설정

 

가져온 생성자로 인스턴스 생성

Cat cat = constructor.new Instance("나비");
System.out.println(cat.getName()); // 나비

 

동적으로 메서드 가져와 실행하기 getMethod()

  • instance 메서드 : 매개변수로 인스턴스 필요
  • static 메서드 : 매개변수 필요 없음
  • private 메서드 : invoke 하기 전에 공개화 할 필요 있음 

실행은 invoke()를 호출하여 실행하면 된다. 

또한, getFields() 메서드를 사용하여 필드 내 정보를 가져온다. 


reflection 장단점

장점

  • 런타임 시점에서 클래스의 인스턴스를 생성하고 접근 제어자와 관계없이 필드와 메서드에 접근하여 필요한 작업을 수행할 수 있게 하는 유연성을 가짐

단점

  • 컴파일 시점에서 타입 체크 기능을 사용할 수 없다. 

참고: https://github.com/devFancy/2023-CS-Study/blob/main/java/java_reflection.md

https://inpa.tistory.com/entry/JAVA-%E2%98%95-%EB%88%84%EA%B5%AC%EB%82%98-%EC%89%BD%EA%B2%8C-%EB%B0%B0%EC%9A%B0%EB%8A%94-Reflection-API-%EC%82%AC%EC%9A%A9%EB%B2%95#reflection_api_%EA%B8%B0%EB%B2%95