JAVA

Reflection

whyWhale 2021. 4. 16.

Reflection


구체적인 클래스 타입을 알지못해도, 클래스의 메소드,타입,변수들을 접근 가능하게 해주는 Java API이다.

 

public class Car() {

    public void straight() {
        sout("car!")
    }

    public static void main(String[] args) {
        Object car = new Car(); // 에러 발생 x.
        car.straight(); // Error! 
    }
}

Object 에 Car라는 인스턴스를 담을 수 있지만 사용가능한 메소드는 Object 의 메소드와 필드만 사용가능하므로 오류가 발생한다.

 

이런식으로 구체 타입을 모를 때 사용하는 것이 리플렉션 이다.

 

컴파일 시점에는 오류가 나지 않지만, 런타입 시점에서 나타내는 오류 이다. 

즉 런타임 시점에서 해당 클래스를 가져와서 실행하야 한다.

 

컴파일한 클래스 정보를 활용하여 동적으로 프로그래밍이 가능하도록 하는 API

 

DI에서는 사용될 클래스가 어떤 타입인지는 몰라도 알수 있는 것은 리플렉션이라는 API 때문이다.

 

동작과정

 

자바 .class 파일이 - > 바이트 코드로 컴파일 되어 static 영역(Heap영역) 에 위치한다.

그렇기 때문에 클래스의 이름만 알고 있다면 이 영역을 뒤져서 해당 클래스의 정보를 가져올수 있다.

  • 가져올수 있는 정보
    • ClassName
    • Class Modifiers
    • Package Info
    • Superclass
    • Implemented Interfaces
    • Constructors
    • MethodsFields
    • Annotations
  • 리플랙션 주의사항
    • 꼭 필요한 경우에만 사용한다.(성능 이슈의 우려가 있으므로)
      • 이미 인스턴스가 있음에도 굳이 필드와 리플렉션을 이용해서 접근할 때
    • 컴파일 타임에 확인되는 오류가 좋은 코드이므로 런타임시에만 발생하는 문제들을 만들 가능성이 있다.
    • 접근 지시자를 무시할 수 있다.

 

 

'JAVA' 카테고리의 다른 글

가비지 콜렉터의 종류  (0) 2021.05.03
Garbage Collector  (0) 2021.04.25
제네릭 타입의 컴파일 영향  (1) 2021.04.10
자바의 compile 과정  (0) 2021.04.04
JVM 구조와 버전에 따른 변경  (0) 2021.03.28

댓글