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 의 존재를 적당히 숨길 수도 있다.
'프로그래밍 놀이터 > 안드로이드, Java' 카테고리의 다른 글
[android] RefreshListView source code. (0) | 2014.01.06 |
---|---|
[android] multiple layers of defense. (0) | 2014.01.03 |
[android] how to add comma in the EditText. (0) | 2013.12.30 |
[Java] Reflection Tutorial - Array (0) | 2013.12.30 |
[android] navigation drawer close and open listener set. (0) | 2013.12.27 |
댓글