Skip to content

김민주, 최세민 ‐ Java Reflection

Semin Choi edited this page Jul 8, 2024 · 1 revision

호눅스님 강의

리플렉션이란?

런타임에 클래스파일 바이트코드를 읽어서 메타데이터를 반환하는 것입니다. JVM은 기계어가 아닌 바이트코드를 읽어서 프로그램을 실행하기 때문에 메타데이터를 읽을 수 있습니다. 기계어를 직접 실행하지 않는 언어는 대부분 리플렉션이 있는 언어들이 있습니다.

어노테이션이란?

Annotation은 직역하면 주석이라는 뜻을 가지고 있습니다. 프로그래밍에서 주석은 실제 동작과는 관련 없는 소스코드에 부가적인 설명이나 의견을 작성하는 것을 의미합니다. 자바의 Annotation도 대상에 작성하여 부가적인 정보를 알리는데 목적이 있습니다.

일반 주석은 컴파일타임에 정보가 사라지지만 어노테이션은 메타어노테이션을 통해 추가적인 정보(적용 대상, Retention 정책)를 주입할 수 있다는 차이점이 있습니다.

미션 수행 학습 내용

리플렉션 원리

  • 컴파일 타임에 바이트코드에 클래스 정보를 저장합니다.
  • 클래스 로더가 클래스 파일을 읽어 들이면서 메모리에 로드하면서 Class 객체를 생성합니다.
  • MyClass.class를 호출하면 참조를 반환합니다.
  • 클래스의 정보는 메타스페이스에 저장됩니다.
    • 메타스페이스는 JVM의 native 메모리로, GC 대상이 아닙니다.

리플렉션 API

  • getDeclaredXXs vs getXXs
    • getDeclaredXXs 는 접근제어자를 구분하지 않고 모든 메타데이터를 반환합니다.
    • getXXs 는 public 접근제어자를 가지는 메타데이터들만 반환합니다.
  • newInstance() Deprecate
    • 해당 메소드는 기본 생성자가 없는 경우에 다양한 예외처리가 어려울 수 있어 상황에 맞는 처리를 할 수 있도록 getConstructor() 메소드를 이용하도록 Deprecated 되었습니다.
  • getDeclaredXX
    • 선언된 대상이 없을 경우 NoSuchFieldException를 throw합니다. (체크예외)
  • setAccessable(flag)
    • getDeclaredXX는 public이 아닌 접근제어자의 메타데이터도 읽을 수 있습니다.
    • 하지만 setAccesable(true)를 설정해 줘야만 필드에 접근하거나 필드에 값을 할당할 수 있습니다.

Retention Policy 유지 기간

Method.invoke 실행 시간

  • 리플렉션은 런타임에 실제 메소드의 참조를 찾아 실행해야되기 때문에 메소드를 직접 실행하는 것보다 느린 것으로 추측됩니다.

    invoke vs 직접 호출 시간 비교
  • 하지만 반복해서 실행하게 되면 중간에 갑자기 실행시간이 높아지고 그 이후로 실행이 최적화 되는 경우가 있습니다. JIT 컴파일러가 자주 실행되는 코드를 미리 컴파일하고 캐싱하는 동작에서 시간이 소요되고 그 이후에는 빠르게 실행되는 것으로 보입니다.

    JIT 최적화

👼 개인 활동을 기록합시다.

개인 활동 페이지

🧑‍🧑‍🧒‍🧒 그룹 활동을 기록합시다.

그룹 활동 페이지

🎤 미니 세미나

미니 세미나

🤔 기술 블로그 활동

기술 블로그 활동

📚 도서를 추천해주세요

추천 도서 목록

🎸 기타

기타 유용한 학습 링크

Clone this wiki locally