티스토리 뷰
자바에서,
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하게 가져올 수 있습니다. 내가 사용하던 메서드의 이름이 바뀐다면 컴파일러 에러가 나겠죠.
나름 괜찮은 방법이라서 공유드립니다.
(회사에 있는 서비스 객체들이 구현체가 하나뿐인데도 인터페이스가 항상 있었는데, 이런 장점이 있네요.)
'JAVA' 카테고리의 다른 글
한글-영어-특수문자 순 정렬하는 java compare 메서드 만들기 (3) | 2016.04.17 |
---|---|
[JAVA:reflection] 자바 프록시로 문제 해결하기! (0) | 2015.10.26 |
[JAVA] 현재 실행중인 메서드 가져오는 방법 (0) | 2015.10.04 |
JSP 버퍼 플러시 후에 < jsp : foword > 한다면? (0) | 2015.03.05 |
jsp application 기본 객체 범위 테스트 (0) | 2015.03.03 |
- Total
- Today
- Yesterday
- javascript
- rest
- S68
- 개발자
- 도커
- container
- 사누르
- 발리
- ecma6
- Bali
- spring
- 웹
- AWS
- hands-on
- ES6
- 한달살기
- 웹을 지탱하는 기술
- 회고
- Docker
- ChatGPT
- 실수노트
- 객체지향
- AWSKRUG
- Clean code
- springboot
- 독후감
- sanur
- 컨테이너
- html
- spring boot
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |