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<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)
생성된 java.lang.Class 인스턴스는 내부 필드, 메소드 등을 조회할 수 있는 다양한 메소드가 구현되어있다.
구현된 메소드는 크게 get*() 와 getDeclared*() 두 가지 형태로 구분 할 수 있다.
주요 출처: 10분 테코톡 파랑, 아키의 리플렉션