[Java][Reflection] Method 인수의 name 속성 알아내기
이걸 알아내서 뭐하냐 싶기도 하지만, 이걸 알아야만 구현이 가능한 것들이 있었다.
예를 들면, Spring에서 지원하는 @RequestMapping(url = "/hello/{id}") 에서 요구되는 기능들이다.
스프링에서 위 애너테이션은 url을 매핑할 뿐만 아니라 인수 중 id와 이름이 같은 인수에 값을 바인딩해준다.
이를 구현하기 위해서는 메서드 인수의 이름을 알아야 한다. 그래야 이름을 이용해 인수가 선언된 순서를 알 수 있고,
순서를 알아야 순서에 따라 해당값들을 바인딩해서 넘겨줄 수 있다.
(자세한 구현은 나중에 토이 프로젝트에 이 부분을 정리할 예정이다.)
그런데 인수의 이름을 알려면, 단순하게 api만 사용해서 알아낼 수 없다는게 문제다.
컴파일 옵션에 "-parameters" 추가해줘야 한다.
그런데 사용하는 자바 버전이 너무 낮다면 이 옵션이 없는 경우가 있는데, 그 경우는 나도 잘... 모르겠다.
gradle 을 사용하고 있다면
https://javachoi.tistory.com/179
[Java] gradle 프로젝트의 컴파일 옵션 추가하기
plugins { id 'java' } group 'org.example' version '1.0-SNAPSHOT' sourceCompatibility = 12 tasks.withType(JavaCompile) { options.compilerArgs.add("-parameters") } 핵심이 되는 코드는 맨 아래부분 tasks..
javachoi.tistory.com
위의 글을 참고하면 된다.
위 설정을 추가하면 리플렉션 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 같은 것들도 출력되는데, 이 인수들은 이 클래스의 상위 클래스에서 상속받은 메서드들의 인수들이다. (아마도 커스텀 메서드가 아니면, 이름이 공개되지 않는듯하다.)