Java 리플렉션 마스터: 런타임에 클래스, 메서드, 필드 검사 및 조작
Java 리플렉션 마스터하기
Java 리플렉션 API로 런타임에 클래스, 메서드, 필드, 생성자 검사 및 수정하여 유연성 향상과 강력한 동적 행동 구현법을 학습합니다.
Java에서 리플렉션은 프로그램이 실행되는 동안 클래스, 인터페이스, 생성자, 메서드, 필드 검사 및 조작을 가능하게 합니다.
Java는 클래스나 인터페이스 메타데이터를 캡슐화하는 Class 클래스 제공. Class 인스턴스가 리플렉션 기능의 관문입니다.
Class 객체 얻기
리플렉션 수행하려면 먼저 Class 객체 필요. 세 가지 일반적인 방법:
Class.forName() 사용 Class<Dog> clazz = Class.forName("com.example.Dog");
완전 정규화 클래스 이름 허용, 아직 로드 안 된 경우 클래스 로드.
- 인스턴스에서
getClass() 사용 Dog dog = new Dog(); Class<Dog> clazz = dog.getClass();
객체 런타임 클래스 검색.
.class 리터럴 사용 Class<Dog> clazz = Dog.class;
Class 객체에 대한 컴파일 타임 참조 제공.
Class 인스턴스 확보 후 메서드, 필드, 생성자, 애너테이션 쿼리 가능.
실전 예제: Dog 클래스 검사
import java.lang.Class; import java.lang.reflect.*; class Animal {} public class Dog extends Animal { public void display() { System.out.println("I am a dog."); } } public class Main { public static void main(String[] args) { try { Dog dog = new Dog(); Class<Dog> clazz = dog.getClass(); System.out.println("Name: " + clazz.getName()); System.out.println("Modifier: " + Modifier.toString(clazz.getModifiers())); System.out.println("Superclass: " + clazz.getSuperclass().getName()); } catch (Exception e) { e.printStackTrace(); } } }
출력
Name: com.example.Dog Modifier: public Superclass: com.example.Animal
이 스니펫에서 Dog 인스턴스 생성, Class 객체 얻기, 클래스 이름, 접근 제어자, 슈퍼클래스 쿼리.
Class 심층 이해는 공식 Java Class 문서 참조.
필드, 메서드, 생성자 탐색
java.lang.reflect 패키지는 특정 멤버 검사용 전용 클래스 제공:
Method – 메서드 상세 정보
Field – 필드 상세 정보
Constructor – 생성자 상세 정보
메서드 리플렉션
Method 클래스는 이름, 반환 타입, 제어자 등 메타데이터 노출. 간결 예제:
import java.lang.reflect.*; class Dog { public void display() { System.out.println("I am a dog."); } private void makeSound() { System.out.println("Bark Bark"); } } public class Main { public static void main(String[] args) { try { Dog dog = new Dog(); Method[] methods = dog.getClass().getDeclaredMethods(); for (Method m : methods) { System.out.println("Method Name: " + m.getName()); System.out.println("Modifier: " + Modifier.toString(m.getModifiers())); System.out.println("Return Type: " + m.getReturnType()); System.out.println(); } } catch (Exception e) { e.printStackTrace(); } } }
출력
Method Name: display Modifier: public Return Type: void Method Name: makeSound Modifier: private Return Type: void
Method 유틸리티 종합 목록은 공식 Method 문서 참조.
필드 리플렉션
필드는 런타임에 접근 및 수정 가능. Field 클래스는 get, set, 제어자 유틸리티 제공. 예제:
import java.lang.reflect.*; class Dog { public String type; private String color; } public class Main { public static void main(String[] args) { try { Dog dog = new Dog(); Class<Dog> clazz = dog.getClass(); // Public 필드 Field typeField = clazz.getField("type"); typeField.set(dog, "labrador"); System.out.println("Value: " + typeField.get(dog)); System.out.println("Modifier: " + Modifier.toString(typeField.getModifiers())); // Private 필드 Field colorField = clazz.getDeclaredField("color"); colorField.setAccessible(true); colorField.set(dog, "brown"); System.out.println("Value: " + colorField.get(dog)); System.out.println("Modifier: " + Modifier.toString(colorField.getModifiers())); } catch (Exception e) { e.printStackTrace(); } } }
출력
Value: labrador Modifier: public Value: brown Modifier: private
고급 사용법은 Field 클래스 문서 탐색.
생성자 리플렉션
생성자는 Constructor 클래스로 검사. 다음 코드 Dog 모든 생성자 나열:
import java.lang.reflect.*; class Dog { public Dog() {} private Dog(int age) {} } public class Main { public static void main(String[] args) { try { Constructor<Dog>[] cons = Dog.class.getDeclaredConstructors(); for (Constructor<Dog> c : cons) { System.out.println("Constructor Name: " + c.getName()); System.out.println("Modifier: " + Modifier.toString(c.getModifiers())); System.out.println("Parameters: " + c.getParameterCount()); System.out.println(); } } catch (Exception e) { e.printStackTrace(); } } }
출력
Constructor Name: Dog Modifier: public Parameters: 0 Constructor Name: Dog Modifier: private Parameters: 1
자세한 내용은 Constructor 문서 참조.