리플렉션(Reflection)은 Java에서 프로그램 실행 중에 클래스, 메서드, 필드 등의 정보를 동적으로 조회하고 수정할 수 있는 기능이다.
1. 리플렉션이란?
Reflection(리플렉션)은 Java에서 실행 중인 프로그램에 대해 클래스, 메서드, 필드 등의 정보를 동적으로 확인하고 조작할 수 있는 기능을 제공하는 기법이다. 이를 통해 컴파일 타임에 알 수 없는 객체의 메타데이터에 접근하거나, 객체의 타입을 알아내고 메서드나 필드에 동적으로 접근하여 호출할 수 있다.
리플렉션을 사용하면 클래스, 메서드, 필드의 구조에 대한 정보를 실행 중에 알 수 있으며, 이를 통해 동적 객체 생성, 메서드 호출, 필드 접근 등을 할 수 있다.
2. 주요 클래스
리플렉션의 주요 클래스는
java.lang.reflect
패키지에 포함되어 있다.Class
: 클래스에 대한 메타데이터를 제공하는 클래스. 클래스 이름, 메서드, 생성자, 필드 등을 조회할 수 있다.
Method
: 클래스의 메서드 정보를 제공하는 클래스. 메서드 이름, 반환 타입, 파라미터 타입 등을 확인하고, 메서드를 실행할 수 있다.
Field
: 클래스의 필드 정보를 제공하는 클래스. 필드의 이름, 타입 등을 확인하고, 값을 읽거나 수정할 수 있다.
Constructor
: 클래스의 생성자 정보를 제공하는 클래스. 생성자의 파라미터 타입 등을 확인하고, 객체를 생성할 수 있습니다.
3. 주요 기능
- 클래스 정보 조회
- 리플렉션을 사용하면 클래스의 정보를 동적으로 조회할 수 있다. 예를 들어, 클래스 이름, 메서드 목록, 필드 목록 등을 실행 중에 알 수 있다.
- 예제 코드
// Example 클래스의 Class 객체 얻는 4가지 방법
Class<?> clazz = Class.forName("Example");
Class<?> clazz = example.getClass();
Class<?> clazz = Example.class;
ClassLoader classLoader = Example.class.getClassLoader();
Class<?> clazz = classLoader.loadClass("Example");
// 클래스의 이름 출력
System.out.println(clazz.getName());
// 클래스의 메서드 목록 출력
for (Method method : clazz.getDeclaredMethods()) {
System.out.println(method.getName());
}
// 클래스의 필드 목록 출력
for (Field field : clazz.getDeclaredFields()) {
System.out.println(field.getName());
}
- 객체의 메서드 호출
- 리플렉션을 사용하여 객체의 메서드를 동적으로 호출할 수 있다. 이때 메서드의 이름이나 매개변수를 알지 못하더라도 실행 중에 확인하여 호출할 수 있다.
- 예제 코드
// 메서드 getDeclaredMethod()로 hello 메서드 찾기
Method greetMethod = clazz.getDeclaredMethod("hello", String.class);
// private/protected 접근 제한 무시
greetMethod.setAccessible(true);
// hello 메서드 호출
greetMethod.invoke(example, "World");
- 필드에 접근
- 객체의 필드 값을 읽거나 수정할 수 있다. 일반적으로 필드는
private
,protected
등의 접근 제어자가 적용되어 있어 외부에서 직접 접근할 수 없지만, 리플렉션을 사용하면 이러한 제약을 무시하고 접근할 수 있다. - 예제 코드
// 필드 name에 접근
Field nameField = clazz.getDeclaredField("name");
// private/protected 접근 제한 무시
nameField.setAccessible(true);
// 필드 값 출력
System.out.println(nameField.get(example));
// 필드 값 수정
nameField.set(example, "New Name");
- 동적 객체 생성
- 리플렉션을 사용하여 클래스의 이름을 통해 객체를 동적으로 생성할 수 있다.
- 예제 코드
// 생성자 찾기
Constructor<?> constructor = clazz.getConstructor(String.class);
// 생성자로 객체 생성
Object obj = constructor.newInstance("Hello, Reflection!");
Share article