본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[Java] Reflection Tutorial - Dynamic Proxies

by 돼지왕 왕돼지 2014. 1. 3.
반응형

 Java, Reflection Tutorial - Dynamic Proxies  

[Java] Reflection Tutorial - Dynamic Proxies


reflection 을 이용하여 runtime에 interface 를 구현할 수도 있다.

다시 말해 proxy를 사용하기 위해서는 구현하고자 하는 interface가 꼭 있어야 한다.


보통 interface 를 구현하는 방법은 다음과 같이 2가지가 있다.


public class FooImpl implmenets FooInterface{

@Override

public void test(){

// do sth...

}

}


new FooImpl{

@Override

public void test(){

// do sth...

}

}


proxy 는 자주 사용되지는 않지만 특별한 경우에 사용하는 세번째 방법이라고 보면 된다.


FooInterface foo = (FooInterface) Proxy.newProxyInstance( FooImpl.class.getClassLoader(), new Class[] { FooInterface.class }, new FooProxyHandler() );


이 방법은 database connection, transaction management, dynamic mock objects for unit test, AOP-like method intercepting 등에 사용될 수 있다.



이 녀석은 기존에 존재하는 어떤 class 의 function call 을 hooking 하는 데 이용될 수 있다. ( 기존 클래스의 exception 을 handle 할수도 있다. )




Creating Proxies


MyInvocationHandler myHandler = new MyInvocationHandler();

TestInterface proxy = (TestInterface) Proxy.newProxyInstance( TestInterfaceImpl.class.getClassLoader(), new Class[] { TestInterface.class }, myHandler );


proxy 에 대한 모든 call 은 InvocationHandler 로 전달이 된다.


Proxy instance 생성시 받는 argument 들은

1. class loader

2. proxy 가 구현할 interface 의 array

3. invocation handler.







InvocationHandler's


// 미리 정해져 있는 녀석 @ java.lang.reflection.InvocationHandler

public interface InvocationHandler{

Object invoke( Object proxy, Method method, Object[] args ) throws Throwable;

}


public class MyInvocationHandler implements InvocationHandler{

public Object invoke( Object proxy, Method method, Object[] args ) throw Throwable{

// do sth...

}

}




Factory Class


Factory 를 이용해서 Proxy 의 존재를 적당히 숨길 수도 있다.



반응형

댓글