Java의 Reflection API는 런타임에서 클래스의 정보를 탐색하고 조작할 수 있도록 해주는 강력한 기능입니다. 이를 활용하면 객체를 동적으로 생성하거나 메서드를 호출할 수 있으며, 프레임워크나 라이브러리에서 많이 사용됩니다. 또한 **동적 프록시(Dynamic Proxy)**는 런타임에서 인터페이스의 구현을 생성하여 메서드 호출을 가로채는 기법으로, AOP(Aspect-Oriented Programming)와 같은 다양한 패턴에서 활용됩니다.
이번 글에서는 Reflection API의 기본 개념부터 동적 프록시를 활용하는 방법까지 상세하게 알아보겠습니다.
1. Reflection API란?
Reflection API는 런타임에 클래스, 메서드, 필드 등의 정보를 조회하고 조작할 수 있도록 제공되는 Java 표준 기능입니다. 이를 사용하면 컴파일 타임이 아닌 실행 중에 동적으로 객체를 다룰 수 있습니다.
1) Reflection API의 주요 기능
Class.forName()
사용)Constructor.newInstance()
사용)Field.get()
및 Field.set()
사용)Method.invoke()
사용)2) Reflection API 기본 사용법
import java.lang.reflect.Method;
class Sample {
public void sayHello() {
System.out.println("Hello, Reflection API!");
}
}
public class ReflectionExample {
public static void main(String[] args) throws Exception {
Class<?> clazz = Class.forName("Sample");
Object obj = clazz.getDeclaredConstructor().newInstance();
Method method = clazz.getMethod("sayHello");
method.invoke(obj);
}
}
출력
Hello, Reflection API!
이처럼 Reflection을 사용하면 클래스명을 문자열로 받아 해당 클래스를 동적으로 생성하고 메서드를 실행할 수 있습니다.
2. Reflection API를 활용한 객체 조작
1) 필드 값 가져오기 및 변경
import java.lang.reflect.Field;
class User {
private String name = "John Doe";
}
public class ReflectionFieldExample {
public static void main(String[] args) throws Exception {
User user = new User();
Class<?> clazz = user.getClass();
Field field = clazz.getDeclaredField("name");
field.setAccessible(true); // private 필드 접근 허용
System.out.println("Before: " + field.get(user));
field.set(user, "Alice");
System.out.println("After: " + field.get(user));
}
}
출력
Before: John Doe
After: Alice
이처럼 private 필드에 접근하여 값을 변경할 수도 있습니다.
3. 동적 프록시(Dynamic Proxy) 활용법
1) 동적 프록시란?
Java의 동적 프록시는 java.lang.reflect.Proxy
와 InvocationHandler
를 사용하여 런타임에 인터페이스의 구현을 동적으로 생성하는 기술입니다. 이를 활용하면 반복적인 코드 작성을 줄이고, AOP(Aspect-Oriented Programming) 기법을 적용할 수 있습니다.
2) 동적 프록시 예제
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
interface Service {
void execute();
}
class RealService implements Service {
public void execute() {
System.out.println("Real Service Executing...");
}
}
class ProxyHandler implements InvocationHandler {
private final Object target;
public ProxyHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("Before execution...");
Object result = method.invoke(target, args);
System.out.println("After execution...");
return result;
}
}
public class DynamicProxyExample {
public static void main(String[] args) {
Service realService = new RealService();
Service proxyInstance = (Service) Proxy.newProxyInstance(
realService.getClass().getClassLoader(),
realService.getClass().getInterfaces(),
new ProxyHandler(realService)
);
proxyInstance.execute();
}
}
출력
Before execution...
Real Service Executing...
After execution...
이처럼 동적 프록시를 사용하면 메서드 실행 전후에 공통 로직을 추가할 수 있습니다.
4. Reflection API와 동적 프록시 활용 사례
5. Reflection API 및 동적 프록시 사용 시 주의점
setAccessible(true)
를 남용하면 보안 취약점이 발생할 수 있으니 주의가 필요합니다.
문의 내용 예시 및 답변
1 사용하면 성능이 저하되는 이유는 무엇인가요?
답변: Reflection을 사용할 경우 런타임에 클래스, 메서드를 탐색하는 과정에서 오버헤드가 발생합니다. 직접적인 메서드 호출보다 느리며, 캐싱 기법을 적용하여 성능 최적화를 할 수 있습니다.
2. 동적 프록시를 활용하면 어떤 이점이 있나요?
답변: 동적 프록시는 코드 중복을 줄이고, 공통 기능(로깅, 트랜잭션 등)을 분리할 수 있습니다. Spring AOP, JDK 동적 프록시와 같은 기술에서 많이 사용됩니다.
3. Reflection API와 동적 프록시의 차이점은 무엇인가요?
답변: Reflection API는 런타임에 클래스와 메서드 정보를 탐색하고 조작할 수 있는 기능이고, 동적 프록시는 인터페이스 기반으로 런타임에 동적으로 프록시 객체를 생성하여 메서드 호출을 가로채는 기술입니다. Reflection이 객체를 직접 조작하는 데 초점을 맞춘다면, 동적 프록시는 실행 흐름을 제어하는 데 유용합니다.
6.결론
Java의 Reflection API와 동적 프록시 활용법에 대해 알아보았습니다. Reflection API와 동적 프록시는 프레임워크, AOP, 직렬화, 테스트 자동화 등 다양한 분야에서 활용되니 적절한 상황에서 올바르게 활용하여 유지보수성과 성능을 고려하여 개발하시면 도움이 될듯합니다. 감사합니다.
일상에서 벗어나 진정한 휴식을 꿈꾼다면, 일본 하코네 온천 료칸만큼 매력적인 여행지도 드물 것입니다. 하지만 검색만…
디즈니랜드 여행을 앞두고 가장 중요한 고민 중 하나는 바로 “숙소 선택”입니다. 꿈같은 하루를 선물하고 싶은…
스이카 카드 발급 해야하는 이유 "도쿄 지하철 정복은 스이카 카드 없으면 절대 불가능합니다!" "이 카드…
리버 크루즈를 타야만 하는 이유 "오사카 여행에서 낮에는 활기찬 거리, 밤에는 화려한 네온사인으로 물든 도시를…
오사카 여행에 필수적인 교통패스인 오사카 교통패스에 대해 소개 하겠습니다. 일본 오사카 여행을 준비 중이시라면, 효율적인…
후쿠오카는 일본 여행지 중에서도 근교 여행지와 맛집, 쇼핑, 자연 풍경, 도시를 한 번에 즐길 수…