Java 리플렉션(Reflection)은 런타임에 클래스, 메서드, 필드 정보를 조회하고 조작하는 기능이다. 프레임워크, ORM, 직렬화 라이브러리의 핵심 메커니즘이다.
Class 객체 획득
java
// 3가지 방법
Class<?> c1 = String.class;
Class<?> c2 = "hello".getClass();
Class<?> c3 = Class.forName("java.lang.String");
// 기본 정보
System.out.println(c1.getName()); // java.lang.String
System.out.println(c1.getSimpleName()); // String
System.out.println(c1.getSuperclass()); // class java.lang.Object
System.out.println(Arrays.toString(c1.getInterfaces()));
필드 접근
java
class Person {
private String name;
public int age;
}
Class<?> cls = Person.class;
Field nameField = cls.getDeclaredField("name");
nameField.setAccessible(true); // private 접근 허용
Person p = new Person();
nameField.set(p, "Alice");
System.out.println(nameField.get(p)); // Alice
메서드 동적 호출
java
Method method = String.class.getMethod("substring", int.class, int.class);
String result = (String) method.invoke("Hello World", 0, 5);
System.out.println(result); // Hello
// 정적 메서드
Method parseInt = Integer.class.getMethod("parseInt", String.class);
int num = (int) parseInt.invoke(null, "42");
어노테이션 처리
java
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@interface Validate { int min() default 0; int max() default 100; }
class Form {
@Validate(min=1, max=50)
String username;
}
// 런타임 어노테이션 읽기
for (Field f : Form.class.getDeclaredFields()) {
Validate v = f.getAnnotation(Validate.class);
if (v != null) {
System.out.printf("%s: min=%d, max=%d%n", f.getName(), v.min(), v.max());
}
}
성능 비교
| 방법 | 상대 속도 | 비고 |
|---|
| 직접 호출 | 1x | 기준 |
| 리플렉션 (캐시) | ~10x 느림 | 메서드 객체 재사용 |
| 리플렉션 (비캐시) | ~100x 느림 | 매번 조회 |
| MethodHandle | ~2x 느림 | Java 7+ 대안 |
관련 개념