Hello, Freakin world!

[Java][Reflection] Method 인수의 name 속성 알아내기 본문

프로그래밍 언어/Java

[Java][Reflection] Method 인수의 name 속성 알아내기

johnna_endure 2020. 3. 31. 13:57

이걸 알아내서 뭐하냐 싶기도 하지만, 이걸 알아야만 구현이 가능한 것들이 있었다.

 

예를 들면, 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 같은 것들도 출력되는데, 이 인수들은 이 클래스의 상위 클래스에서 상속받은 메서드들의 인수들이다. (아마도 커스텀 메서드가 아니면, 이름이 공개되지 않는듯하다.)

Comments