[java] Reflection

KIM Jongwan·2024년 1월 8일
0

JAVA

목록 보기
2/2
post-thumbnail

java Reflection이란?


Apache POI 라이브러리를 사용하여 추상화된 엑셀 다운로드 모듈을 만들던 중 리플렉션(Reflection)의 개념에 대해 학습 할 필요가 생겼다.

Reflection enables Java code to discover information about the fields, methods and constructors of loaded classes, and to use reflected fields, methods, and constructors to operate on their underlying counterparts, within security restrictions. (이하생략) oracle java document

공식 문서에서 설명하고있는 java.lang.reflect API에 대한 설명이다.

java의 경우 어플리케이션 구동 시 클래스 정보를 클래스 로더를 통해 읽어 JVM의 메모리(힙)에 저장한다. 이러한 메모리 영역을 통해 클래스의 인스턴스를 생성하고 필드, 메소드를 사용할 수 있도록 지원하는 java API가 reflect이다.

사용법


Class 객체 생성

Class<Student> clazz1 = Student.class;  //-- (1) 

Student student = new Student();
Class<? extends Student> clazz2 = student.getClass(); //-- (2)

Class<?> clazz3 = Class.forName("com.reflect.Student"); //-- (3)

reflection을 활용하여 Class를 생성하는 방법은 3가지가 존재한다.
1. 클래스.class
2. 인스턴스.getClass()
3. Class.forName(FQCN)

methods

생성된 java.lang.Class 인스턴스는 내부 필드, 메소드 등을 조회할 수 있는 다양한 메소드가 구현되어있다.

구현된 메소드는 크게 get*()getDeclared*() 두 가지 형태로 구분 할 수 있다.

  • get*()
    • getFields(), getMethods(), getAnnotations() 등
    • 클래스에 정의된 필드, 메소드, 어노테이션 등의 정보를 가져온다
    • 상속받은 부모 클래스, 인터페이스를 포함하는 모든 public 요소를 조회한다.

  • getDeclared*()
    • getDeclaredFields(), getDeclaredMethods(), getDeclaredAnnotations() 등
    • 클래스에 정의된 필드, 메소드, 어노테이션 등의 정보를 가져온다
    • 상속 받은 클래스나 인터페이스를 제외하고 클래스 내에 직접 정의되어있는 내용을 가져온다
    • 접근제한자와 상관 없이 모든 요소 조회 가능

생성자 조회

필드 조회

메서드 조회

부모 클래스, 인터페이스 조회


리플렉션의 단점


  • 일반 메서드 호출보다 성능이 떨어진다
    • Reflection API는 컴파일 시점이 아닌 런타임 시점에 클래스를 분석하기 때문에 JVM최적화를 할 수 없어 성능 저하가 발생한다.
  • 컴파일 시점에 타입 체크 기능을 사용할 수 없다.
    • 일반적으로 변수를 선언하고 사용할 경우 초기화 시 타입이 올바르지 않으면 컴파일 타임에서 Exception을 발생시켜 프로그래머가 확인 가능하다 Reflection API는 런타임 시점에 클래스의 정보를 알아내기 때문에 타입 체크 기능을 사용할 수 없다.
  • 코드 복잡도가 증가한다.
  • 내부에 선언된 정보들을 노출하여 추상화를 파괴한다.

주요 출처: 10분 테코톡 파랑, 아키의 리플렉션

profile
2년차 백앤드 개발자입니다.

0개의 댓글