[Java] Reflection API 알아보기

2024. 1. 10. 01:52·Java
728x90

 

 

런타임 단계에서 클래스 정보를 알아야 할 때 사용하기 좋은 도구인 Reflection API에 대해 알아보자!

 

 

0. 왜 필요할까?

 

public static void main(String[] args) {
    Object obj = new Hello();
    obj.main();     // Error
}

- 자바는 컴파일 시점에 타입을 결정

- Object 타입인 obj는 Hello 객체를 받아도 main 메서드를 실행할 수 없다

- 이런 경우에 Reflection API를 이용해, 런타임에 클래스의 이름만으로 클래스를 로딩하여 멤버를 사용할 수 있다!

 

 

 

 

1. Reflection API란?

-구체적인 클래스 타입을 알지 못해도 클래스의 정보(메서드, 타입, 변수 등)에 접근할 수 있게 해주는 Java API

    •  java.lang.reflect 

- 클래스 이름만 알고 있다면 static 영역을 뒤져 정보를 가져온다

    • JVM 실행 시 자바 코드가 바이트 코드로 변환되어 static 영역에 저장된다

 

 

🟢 런타임 시점에 사용할 인스턴스를 선택하고 동작시킬 수 있게 해준다

    • Spring에서 Bean은 런타임에 객체가 호출될 때 동적으로 객체의 인스턴스 생성

    • 이때 Spring Container의 BeanFactory에서 Reflection 사용

 

🔴 컴파일 타임이 아닌 런타임에 가져오는 것의 단점

    • 성능 오버헤드 : 런타임에 타입 분석 / 정보 가져오기 때문에 JVM 최적화 불가

    • 컴파일 시점의 Type, Exception 등의 검증 불가

🔴 추상화 / 캡슐화 깨짐 : private 인스턴스 변수, 메서드에 접근

 

 

- 우리가 코드를 작성할 때에는 구체적인 클래스를 모를 일이 거의 없고 Reflection은 치명적인 단점을 가지기 때문에

   코드에 직접 작성할 일은 드물지만, 프레임워크나 라이브러리에서 많이 사용된다

 

 

 

 

2. 적용 예시

 

2.1. 메서드 접근하기

import java.lang.reflect.*;

public class Main {
    public static void main(String[] args) throws Exception {
        Class helloClass = Class.forName("Hello");		// (1)
        Method main helloClass.getDeclaredMethod("main");	// (2)
        main.setAccessible(true);		// (3)
        main.invoke(hello);			// (4)
    }
}

(1) 클래스 이름으로 클래스 객체 정보 가져오기

    - 클래스 파일(*.class) 파일이 메모리에 올라갈 때, 클래스 파일마다 클래스 객체가 하나씩 생성된다

(2) Hello 클래스에 선언된 main 메서드 가져오기

(3) main 메서드를 사용 가능하게 하기 : Hello 클래스의 main 메서드가 private 인 경우 실행 가능하도록 한다

(4) Hello 클래스의 main 메서드 호출

 

 

2.2. 새로운 객체 생성하기

import java.lang.reflect.*;

public class Main {
    public static void main(String[] args) throws Exception {
        Class helloClass = Class.forName("Hello");
        Hello hello = (Hello)helloClass.newInstance();
    }
}

 

 

 

 

 

 

 

📌  References

- https://lob-dev.tistory.com/entry/Java%EC%9D%98-Reflection-API

 

Java의 Reflection API와 성능 이슈?

Reflection이란? Compile Time에 Class나 Method 명을 알지 못하더라도 Runtime에 Type, Classpath를 이용하여 인스턴스화, 객체의 상태, 메서드 정보 등을 가져올 수 있도록 지원하는 API이다. 사용하는 Library, Fram

lob-dev.tistory.com

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

 

Reflection API 간단히 알아보자.

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

tecoble.techcourse.co.kr

 

 

 

728x90
저작자표시 비영리 (새창열림)

'Java' 카테고리의 다른 글

[Mac] Java 17 설치 및 버전 변경 (JDK 17)  (0) 2025.06.03
[Java] Model : DTO / VO / DAO / Utility  (0) 2024.01.31
[Java] JVM 구조와 메모리 영역  (0) 2024.01.05
[Java] 자바 실행 환경 JDK / JRE / JVM  (0) 2024.01.03
[Java] 자바 플랫폼 종류 (Java SE / EE / ME)  (0) 2024.01.02
'Java' 카테고리의 다른 글
  • [Mac] Java 17 설치 및 버전 변경 (JDK 17)
  • [Java] Model : DTO / VO / DAO / Utility
  • [Java] JVM 구조와 메모리 영역
  • [Java] 자바 실행 환경 JDK / JRE / JVM
s_ih_yun
s_ih_yun
  • s_ih_yun
    CODESYUN
    s_ih_yun
  • 전체
    오늘
    어제
    • 분류 전체보기 (339)
      • Web (8)
      • Java (7)
      • Spring (19)
      • Git (16)
      • MyBatis (1)
      • HTML & CSS (14)
      • JavaScript (11)
      • DevOps (4)
      • Cloud (8)
      • Lanuage (13)
        • C++ (3)
        • Python (10)
      • DB (1)
        • MySQL (1)
        • Oracle (2)
      • Computer Science (26)
        • Concept (3)
        • Algorithm (23)
      • Baekjoon (104)
        • 단계별로 풀어보기 (78)
      • CodeUp (98)
        • Python 기초 100제 (98)
      • Programmers (2)
      • Books (3)
      • etc (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

    • Syun's Pages
  • 인기 글

  • 태그

    C
    단계별로 풀어보기
    git
    db
    spring
    clean code
    VS Code
    java
    알고리즘
    CodeUp 기초 100제
    HTML
    JavaScript
    Python
    aws
    BOJ
    CSS
    github
    MySQL
    Tistory
    codeup
    자료구조
    oracle
    c++
    SourceTree
    Cloud
    myBatis
    웹
    Programmers
    web
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
s_ih_yun
[Java] Reflection API 알아보기
상단으로

티스토리툴바