Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- dp
- 구현
- docker-compose
- Zuul
- 구간 트리
- Logback
- 게이트웨이
- 다익스트라
- 백트래킹
- 주울
- 이분 매칭
- 트리
- Java
- spring cloud
- ZuulFilter
- 도커
- 스택
- 유레카
- BFS
- 스프링 시큐리티
- 플로이드 와샬
- 비트마스킹
- 서비스 디스커버리
- 메모이제이션
- spring boot
- Spring Cloud Config
- 완전 탐색
- Gradle
- 달팽이
- 이분 탐색
Archives
- Today
- Total
Hello, Freakin world!
[Java][Reflection] Method 인수의 name 속성 알아내기 본문
이걸 알아내서 뭐하냐 싶기도 하지만, 이걸 알아야만 구현이 가능한 것들이 있었다.
예를 들면, Spring에서 지원하는 @RequestMapping(url = "/hello/{id}") 에서 요구되는 기능들이다.
스프링에서 위 애너테이션은 url을 매핑할 뿐만 아니라 인수 중 id와 이름이 같은 인수에 값을 바인딩해준다.
이를 구현하기 위해서는 메서드 인수의 이름을 알아야 한다. 그래야 이름을 이용해 인수가 선언된 순서를 알 수 있고,
순서를 알아야 순서에 따라 해당값들을 바인딩해서 넘겨줄 수 있다.
(자세한 구현은 나중에 토이 프로젝트에 이 부분을 정리할 예정이다.)
그런데 인수의 이름을 알려면, 단순하게 api만 사용해서 알아낼 수 없다는게 문제다.
컴파일 옵션에 "-parameters" 추가해줘야 한다.
그런데 사용하는 자바 버전이 너무 낮다면 이 옵션이 없는 경우가 있는데, 그 경우는 나도 잘... 모르겠다.
gradle 을 사용하고 있다면
https://javachoi.tistory.com/179
위의 글을 참고하면 된다.
위 설정을 추가하면 리플렉션 api들을 이용하는 일만 남았다.
import org.junit.Test; import java.lang.reflect.Method; import java.lang.reflect.Parameter; import java.util.Arrays; import java.util.List; public class TestReflection { public void test(int id){} @Test public void testShowParameter() throws NoSuchMethodException { Method[] methods = this.getClass().getMethods(); for (Method m : methods) { Arrays.stream(m.getParameters()) .forEach(p -> System.out.println(p.getName())); } } }
위를 실행시켜보면 콘솔에 id 를 확인할 수 있다.
그리고 또 args0, args1 같은 것들도 출력되는데, 이 인수들은 이 클래스의 상위 클래스에서 상속받은 메서드들의 인수들이다. (아마도 커스텀 메서드가 아니면, 이름이 공개되지 않는듯하다.)
'프로그래밍 언어 > Java' 카테고리의 다른 글
[Java] Thread를 종료하는 방법 두 가지 (0) | 2020.04.02 |
---|---|
[Java] volatile에 대한 고찰(용도, 스레드 세이프, 실제적 쓰임) (0) | 2020.04.02 |
[Java] gradle 프로젝트의 컴파일 옵션 추가하기 (0) | 2020.03.30 |
[Java] 정규표현식 핵심만 알고 간단하게 사용하자 (0) | 2020.03.30 |
[Java] ServerSocket(Channel) 동기방식의 accept 동작 방식 (0) | 2020.03.19 |
Comments