다이나믹 프록시란?
- 프록시는 타겟 코드의 수정없이 접근제어 혹은 부가기능을 추가하기 위해 주로 사용됩니다.
- 프록시를 사용하기 위해서 대상 클래스 수만큼 프록시 클래스를 하나하나 만들어줘야 하는것이 반복되는 코드가 들어가서 코드중복이 발생하게 됩니다.
newProxyInstance()
- Java reflection API, newProxyInstance() 메서드 사용하는것이 런타임에서 프록시 클래스를 만들어 주기 때문에 중복으로 클래스를 만들필요가 없습니다.
- ClassLoader: 프록시 클래스를 생성할 클래스로더
- Class: 프록시 클래스가 구현할 인터페이스
- InvocationHandler: 메서드가 호출되었을 때 실행될 핸들러
@CallerSensitive
public static Object newProxyInstance(ClassLoader loader,
Class<?>[] interfaces,
InvocationHandler h)
InvocationHandler
- invoke() 메서드만 가지고 있는 인터페이스입니다.
- invoke() 메서드는 런타임 시점에 생긴 동적 프록시의 메서드가 호출되었을 때
- 프록시 클래스마다 들어간 반복된 코드를 한번만 작성해서 코드가 중복되는 단점을 해결할 수 있습니다.
- Object: 프록시 객체
- Method: 메서드 정보
- Object[]: 메서드에 전달된 파라미터
public interface InvocationHandler {
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable;
}