리플렉션 API

리플렉션 API (The Reflection API)

리플렉션(Reflection)은 Java 가상 머신에서 실행 중인 애플리케이션의 런타임 동작을 조사하거나 수정할 수 있는 기능이 필요한 프로그램에서 흔히 사용돼요. 이건 비교적 고급 기능이라, 언어의 기초를 확실히 이해한 개발자만 써야 해요. 이 경고를 염두에 두면, 리플렉션은 강력한 기법이고 애플리케이션으로 하여금 그렇지 않으면 불가능한 작업을 수행하게 해줘요.

출처: dev.java - The Reflection API

본문

이 튜토리얼은 리플렉션의 각 주제를 하나씩 다룹니다. 다음 링크를 따라가면 각 주제의 상세 내용을 배울 수 있어요.

  • Introducing the Reflection API — 리플렉션 API 소개: Java 가상 머신에서 실행 중인 애플리케이션의 런타임 동작을 조사하거나 수정하는 방법이에요.
  • Retrieving Classes — 이름에서 또는 객체로부터 클래스 인스턴스를 가져오는 방법을 배워요. 배열과 원시 타입을 포함해서요.
  • Reading Class Names — 클래스의 이름이 무엇이고 어떻게 읽는지 배워요. 배열과 원시 타입을 포함해요.
  • Reading Modifiers — 클래스나 클래스 멤버(필드·메서드·생성자)의 수정자(modifier)를 알아내는 방법이에요.
  • Reading and Writing Fields — 필드는 타입과 주어진 객체에 대한 연관된 값을 가져요. Field 클래스의 메서드로 필드의 이름·타입·수정자·애노테이션 같은 정보를 얻을 수 있어요. 필드 값에 동적으로 접근하고 수정하게 해주는 메서드도 있어요.
  • Invoking Methods — 메서드는 호출될 수 있는 실행 가능한 코드를 담아요. 메서드는 상속되며, 리플렉션이 아닌 코드에서는 오버로딩·오버라이딩·히딩 같은 동작이 컴파일러에 의해 강제돼요. 반면 리플렉션 코드는 슈퍼클래스를 고려하지 않고 특정 클래스에 한정해 메서드 선택을 제한할 수 있게 해줘요. 슈퍼클래스 메서드에는 접근할 수 있지만 그 선언 클래스를 알아낼 수도 있는데, 이는 리플렉션 없이는 프로그램적으로 발견할 수 없는 일이고 많은 미묘한 버그의 원인이 돼요.
  • Invoking Constructors — 생성자는 클래스의 인스턴스인 객체를 만드는 데 사용돼요. 일반적으로 메서드가 호출되거나 필드에 접근되기 전에 클래스를 초기화하는 데 필요한 작업을 수행해요. 생성자는 절대 상속되지 않아요.
  • Working with Arrays — 배열은 같은 타입의 고정된 개수의 컴포넌트를 담는 참조 타입 객체예요. 배열의 길이는 불변이죠. 배열 인스턴스를 만들려면 길이와 컴포넌트 타입을 알아야 해요. 각 컴포넌트는 원시 타입(byte, int, double), 참조 타입(String, Object, java.nio.CharBuffer), 또는 배열일 수 있어요. 다차원 배열은 사실 배열 타입의 컴포넌트를 담는 배열일 뿐이에요.
  • Working with Enumerations — enum은 고정된 명명된 값 집합이 필요할 때 사용하는 타입 안전한 열거를 정의하는 언어 구조예요. 모든 enum은 java.lang.Enum을 암묵적으로 확장해요. enum은 enum 타입의 고유한 인스턴스를 정의하는 enum 상수를 하나 이상 담을 수 있어요. enum 선언은 필드·메서드·생성자(일부 제약 포함) 같은 멤버를 가질 수 있다는 점에서 클래스와 매우 비슷한 enum 타입을 정의해요.
  • Working with Records — 레코드 타입을 식별하고, 컴포넌트에 대한 정보를 얻고, 필드에 접근하는 방법이에요.
  • Reading Annotations — 클래스 요소와 타입에서 애노테이션을 발견하는 방법이에요.
  • Creating an Interceptor with Annotations — 애노테이션과 리플렉션 API를 사용해 서비스 메서드에 간단한 인터셉터를 만드는 과정을 안내해요.
  • Creating a Dependency Injection Framework — 애노테이션과 리플렉션 API를 사용해 간단한 의존성 주입 프레임워크를 만드는 과정을 안내해요.

더 알아보기