Java 코드에서 메소드 매개변수 이름 정보를 가져오는 방법

앞말
자바8의 사용에 따라 상응하는 방법 서명에 새로운 대상 파라미터가 추가되었습니다. 특정한 파라미터 정보를 표시하는 데 사용되며, getName을 통해 상응하는 파라미터 이름을 얻을 수 있습니다.코드에서 작성된 것처럼, 예를 들어username이라고 명명하면, 프론트에서 전참할 때, @Parameter ("username") 클래스의 주석을 더 이상 작성할 필요가 없고, 이름에 따라 비추면 된다.
다음 코드 참조는 다음과 같습니다.

public class T {
 private interface T2 {
  void method(String username, String password);
 }
 
 public static void main(String[] args) throws Exception {
  System.out.println(T.class.getMethod("main", String[].class).getParameters()[0].getName());
  System.out.println(T2.class.getMethod("method", String.class, String.class).getParameters()[0].getName());
  System.out.println(T2.class.getMethod("method", String.class, String.class).getParameters()[1].getName());
 }
}
자바8을 누르기 전에도 일부 수단을 통해 매개 변수 이름 정보를 얻을 수 있지만 방식이 다를 뿐이다.스프링mvc의 ParameterMethodNameResolver를 통해 이전 버전에서도 정상적으로 작동할 수 있습니다.특별한 번역이 필요할 뿐이야.이 안에서 작용하는 것은 바로 LocalVariableTableMethodParameters이다. 중국어는 로컬 변수표와 방법 매개 변수표로 번역된다.
LocalVariableTable 로컬 변수 테이블
jvm규범에 따르면 로컬 변수표는 코드 속성에 존재하고 코드 속성은 methodInfo의 속성이다.한 방법이 방법체가 있을 때 상응하는 코드 속성이 나타나고 코드 속성에서 구체적인 실행 코드 외에 다른 정보가 있다는 것을 이해할 수 있다.각 행 코드가 있는 위치를 설명하는 LineNumberTable과 같습니다.
로컬 변수표는 방법에서 디버깅 정보의 일부분에 속하기 때문에 기본적으로 이 정보는class 파일에 생성되지 않습니다.-g 또는 -g:vars 스위치를 켜야 합니다.다행히도, id나 마븐 컴파일러에 있어서, 이 스위치들은 기본적으로 켜져 있습니다.id에서 (generate debugging info는 ida에 대한) 설정을 통해 제어할 수 있습니다. (기본 체크)maven에서 플러그인maven-compiler-plugin의 debug나 debugLevel을 통해 출력 여부를 제어합니다 (기본값은true).
로컬 변수 테이블은 javap 다음에 표시됩니다.

// 
  LocalVariableTable:
  Start Length Slot Name Signature
   0  1  0 this LT;
   0  1  1 count J
   0  1  3 name Ljava/lang/String;
 
// 
  LocalVariableTable:
  Start Length Slot Name Signature
   0  101  0 args [Ljava/lang/String;
로컬 변수표는 매개 변수 정보를 저장할 뿐만 아니라 전체 방법체에서 사용할 수 있는 임시 변수, 예를 들어 성명된 int i 등에도 저장합니다.그리고 위에서 보듯이 표현 방법과 비정태 방법은 첫 번째에this 변수의 차이가 있다.따라서 매개 변수 개수(method.getParameterCount를 읽고 방법에 따라 서명하여 로컬 변수 테이블에서 지정한 개수의 매개 변수 정보를 읽으면 된다.
주의해야 할 것은 위의 그림에서 매개 변수가long 또는double이면 slot이 2개를 차지하고 slot을 통해 매개 변수 정보를 얻을 때 매개 변수의 유형 정보를 고려해야 한다는 것이다.
인터페이스 방법은code 속성이 없기 때문에 로컬 변수표도 없습니다. 인터페이스를 얻는 방법의 정의는 로컬 변수표를 통해 해당하는 매개 변수 이름을 얻을 수 없습니다.
MethodParameters 메서드 매개변수 테이블
방법 매개 변수표는 1.8 이후에 도입된 것이기 때문에 jdk8 컴파일로 생성된class 파일만 이 정보를 얻을 수 있습니다.로컬 변수 테이블과 달리 MethodInfo 속성에 속합니다. 즉, 코드 속성과 같은 레벨입니다.인터페이스 방법이든 일반적인 방법이든 모두 이 속성이 있다.따라서 인터페이스 방법이라도 상응하는 매개 변수 정보를 얻을 수 있다.
기본적으로,class에는 이 정보가 없습니다.특수한 컴파일 매개 변수-parameters를 사용해야만 생성할 수 있으며,ide와maven에서도 기본적으로 이 정보를 생성하지 않습니다.아이디어에서,javaadditionallineparameters에 이 컴파일 파라미터를 추가해야 합니다.마ven에서도 마ven-compiler-plugin의 compilerArgs 매개 변수에 이 매개 변수를 추가해야 합니다.
메소드 매개변수 테이블은 javap 다음에 다음과 같이 표시됩니다.

// 
 MethodParameters:
  Name       Flags
  count
  name
 
// 
 MethodParameters:
  Name       Flags
  args
정적 여부와 상관없이 매개 변수 테이블에는 매개 변수를 설명하는 정보만 나타날 수 있음을 알 수 있다.뒤에 있는 Flags 파라미터는 특수한 장면에 사용됩니다. 예를 들어 final 파라미터는 방법 개작에 사용됩니다.
사용 가능한 도구
원생api와spring 도구 패키지를 사용하는 것을 제외하고 다른 일부 도구는 매개 변수 이름 정보를 얻을 수 있습니다.스프링 시스템에서 매개 변수 이름을 설명하는 인터페이스는 ParameterNameDiscoverer 이다.그것을 통해 상응하는 매개 변수 이름 정보를 얻을 수 있다.이외에도 com.thoughtworks.paranamer:paranamer 이 도구 패키지의 Paranamer도 상응하는 정보를 처리할 수 있다.그러나 jdk8의 method Parameters에 대한 지지도가 아직 높지 않아서 사용자는 그것을 확장함으로써 자신의 목적을 달성할 수 있다.
총결산
이상은 여러분을 위해 정리한 자바에서 코드에 있는 방법의 매개 변수 이름 정보를 얻는 방법입니다. 여러분이 자바를 배우거나 사용하는 데 어느 정도 도움이 되기를 바랍니다. 의문이 있으면 댓글로 교류할 수 있습니다.

좋은 웹페이지 즐겨찾기