java. 리플렉션(reflection)을 통한 인터페이스(Interface) 동적 구현

인터페이스의 타입 정보를 특정할 수 없는 상황에서도
해당 인터페이스를 구현한 객체를 생성할 수 있습니다.

인터페이스와 클래스가 다음과 같이 정의되어 있다고 합시다.

인터페이스입니다.
package some.test;

public interface SomeInterface{
 public int some();
}

클래스입니다.
package some.test;

public class SomeClass{

 public int test( SomeInterface i ){
  return i.some();
 }

}

해당 인터페이스와 클래스의 타입정보를 특정할 수 없는 상황에서도
다음과 같이 인터페이스를 구현한 객체를 생성하고 사용할 수 있습니다.

public static void main( String[] args )throws Exception{

 InvocationHandler impl = new InvocationHandler(){
  @Override
  public Object invoke( Object proxy, Method method, Object[] args )throws Throwable{
   if( method.getName().equals( "some" ) ){
    return new Integer( 3 );
   }
   return null;
  }
 };
 Object param = Proxy.newProxyInstance( TestInterface.class.getClassLoader(), new Class[]{ Class.forName( "some.test.SomeInterface" ) }, impl );
 
 Object someCls = Class.forName( "some.test.SomeClass" ).newInstance();
 Method  m = someCls.getClass().getMethod( "test", Class.forName( "some.test.SomeInterface" ) );
 Object rtn = m.invoke( someCls, param );
 
 System.out.println( rtn );//3

}

다른글 읽기