Programming/Java

[Java] Reflection API 알아보기

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