티스토리 뷰

반응형

자바에서,


java.lang.reflect.Method 클래스의 invoke 메소드를 써야할 경우들이 있습니다.

그런데 보통 리플렉션을 통해서 메서드를 가져올 때 String 타입의 메서드 이름과 파라미터 클래스를 통해서 메서드 객체를 가져옵니다.

이 방법의 단점은 문자열로 메서드를 검색하기 때문에 typesafe 하지 않다는 단점이 있습니다.

(리펙토링을 해서 메서드의 이름이 바뀐다면, 에러가 나지는 않지만 그 기능은 사용할 수 없게 됩니다.)


그 단점을 극복하기 위해서 여러 방법을 찾아 보다가, MethodSelector라는 것을 알게 되었습니다.

https://gist.github.com/stijnvanbael/5965609


<사용법>

public interface TestService {
public TestBO testmethod(String string);
public TestBO testmethod(String string, String string2);
public int testmethod2(TestBO testbo);
}

MethodSelector<TestService> selector = new MethodSelector<TestService>(TestService.class);
selector.select().testmethod("test");
Method method = selector.getMethod();

위처럼 TestService라는 객체에 testmethod(String)이 있습니다. 

셀렉터를 생성하고 셀렉트를 한 후에 (내부적으로 프록시 객체를 만든다) 내가 찾고자 하는 메서드를 실행하고, 셀렉터에서 getMethod하면 내가 실행했던 메서드 객체를 가져올 수 있습니다. 

여기서 주의해야 할 점은 TestService 는 인터페이스라는 점입니다.


method.invoke(new TestServiceImpl(), "test"))

가져온 메서드는 위처럼 쉽게 사용할 수 있습니다.

TestServiceImpl은 제가 실제로 실행하고자 하는 구현체입니다. 


정리하면,

위의 MethodSelector는 인터페이스를 구현하는 서비스 객체에서 내가 원하는 메서드를 typesafe하게 가져올 수 있습니다. 내가 사용하던 메서드의 이름이 바뀐다면 컴파일러 에러가 나겠죠.


나름 괜찮은 방법이라서 공유드립니다.


(회사에 있는 서비스 객체들이 구현체가 하나뿐인데도 인터페이스가 항상 있었는데, 이런 장점이 있네요.)

반응형
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함