관리 메뉴

Rootable의 개발일기

자바 리플렉션 API 본문

Java

자바 리플렉션 API

dev-rootable 2023. 9. 12. 15:29

📌 리플렉션(Reflection)이란

 

구체적인 클래스 타입을 알지 못해도 그 클래스의 메서드, 타입, 변수들에 접근할 수 있도록 해주는 자바 API

 

🔎 예시

 

아래 코드처럼 Object라는 클래스로 A라는 클래스를 다형성을 통해 받을 수 있다. 하지만 Object 클래스의 참조 변수 o는 A의 특정 메서드에 접근할 수 없다.

 

Object o = new A();
o.function(); //Compile error

 

그 이유는 자바는 컴파일 타임에 타입을 결정하는데, 이미 컴파일 시점에 결정된 타입에 대한 인스턴스 변수와 메서드만 사용할 수 있기 때문이다.

 

하지만 Reflection API가 있어 구체적인 정보를 모르는 클래스에 접근할 수 있다.

 

Class A_class = A.class;
Method function = A_class.getMethod("function");

function.invoke(o, null); //function 메서드 실행

 

이처럼 Reflection API는 클래스의 이름만 가지고도 생성자, 필드, 메서드 등등 해당 클래스에 대한 거의 모든 정보를 가져올 수 있다.

 

🔎 원리

 

Reflection API는 static 영역에 저장된 바이트 코드 정보를 클래스 이름만 알면 언제든 가져올 수 있어 가능하다.

 

🔎 활용

 

코드를 작성하는 시점이 아닌 런타임 시점에 동적으로 객체를 생성하고 싶을 때 사용된다. 코드 작성 시점에는 개발자가 구체적인 클래스를 모를 일이 거의 없다. 따라서, Reflection 기능은 개발보다는 주로 프레임워크나 라이브러리에서 동적으로 필요한 객체를 생성해 줄 때 사용된다. 예를 들어 IntelliJ의 자동 완성, Jackson 라이브러리, Hibernate 등이 있다.

 

Spring 프레임워크에서 스프링 컨테이너의 BeanFactory에서도 Reflection을 사용한다. 스프링 컨테이너는 스캔 범위에 있는 객체를 Bean으로 등록하는데, Bean은 프로그램 실행 후 런타임에 객체가 호출될 때 Reflection을 통해 동적으로 객체의 인스턴스를 생성한다.

 

Spring Data JPA에서도 Reflection API을 통해 동적으로 Entity 객체를 생성하는데, Reflection API로 생성자의 인자 정보를 가져올 수 없어 반드시 기본 생성자가 필요하다.

 

References:

https://tecoble.techcourse.co.kr/post/2020-07-16-reflection-api/

 

Reflection API 간단히 알아보자.

Spring Framework를 학습하다 보면 Java Reflection API를 자주 접하게 된다. 하지만 Reflection API…

tecoble.techcourse.co.kr

 

https://dev-coco.tistory.com/153

 

신입 개발자 기술면접 질문 정리 - 자바

💡 Java의 특징을 설명해주세요. Java는 객체지향 프로그래밍 언어입니다. 기본 자료형을 제외한 모든 요소들이 객체로 표현되고, 객체 지향 개념의 특징인 캡슐화, 상속, 다형성이 잘 적용된 언

dev-coco.tistory.com

 

'Java' 카테고리의 다른 글

final 키워드  (0) 2023.09.13
try-with-resources  (0) 2023.09.13
자바언어의 특징  (0) 2023.09.09
Java 컴파일 과정과 JVM  (0) 2023.09.09
객체 지향 프로그래밍(Object Oriented Programming)  (0) 2023.05.01