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