proxy 기능으로 AOP를 만들어 보자!

java.lang.reflect 패키지에 InvocationHandler 인터페이스가 존재한다. 이 인터페이스를 이용해 AOP를 구현할 수 있다.
간단히 어떤수의 두배하는 메소드를 만들어보자

class TwiceImpl implements Twice {

    @Override
    public int twice(int x) {
        return x * 2;
    }
}

interface Twice {
    int twice(int x);
}

이 코드를 사용하려면 이렇게 하면 된다. 위의 클래스의 인터페이스를 만든이유는 인터페이스가 있어야 java의 Proxy AOP를 만들수있다.

Twice twice = new TwiceImpl();
System.out.println(twice.twice(5));

이제 InvocationHandler 인터페이스를 이용하여 AOP를 구현해보자

class JavaProxyHandler implements InvocationHandler {
    private Object target;

    public JavaProxyHandler(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("메소드 호출 전");
        int result = (int) method.invoke(target, args);
        System.out.println("메소드 호출 후");
        return result;
    }
}

이제 Proxy가 구현되었다.

그럼 Proxy 객체로 다시 호출해보자!

Twice twice = new TwiceImpl();
Class<? extends Twice> twiceGetClass = twice.getClass();
Twice twiceProxy = (Twice) Proxy.newProxyInstance(
        twiceGetClass.getClassLoader(),
        twiceGetClass.getInterfaces(),
        new JavaProxyHandler(twice));
System.out.println(twiceProxy.twice(5));

그럼 결과는 다음과 같을 것이다.

메소드 호출 전
메소드 호출 후
10

참고 : AspectJ로 구현한 AOP