다이나믹 프록시란?

  • 프록시는 타겟 코드의 수정없이 접근제어 혹은 부가기능을 추가하기 위해 주로 사용됩니다. 
  • 프록시를 사용하기 위해서 대상 클래스 수만큼 프록시 클래스를 하나하나 만들어줘야 하는것이 반복되는 코드가 들어가서 코드중복이 발생하게 됩니다. 

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;
}