머리말
Java8을 사용하면 특정 매개 변수 정보를 나타내는 새로운 객체 매개 변수가 해당 메소드 서명에 추가되었다는 것을 모두 알고 있습니다. 해당 매개 변수 이름은 getName을 통해 얻을 수 있습니다. 즉, 코드 이름과 같은 코드에 작성된 것처럼 전경에서 매개 변수를 전달할 때 @parameter ( "username") 클래스와 같은 주석을 작성할 필요는 없지만 이름별로 직접 매핑 할 수 있습니다.
다음 코드 참조가 표시됩니다.
public class t {private interface t2 {void method (문자열 사용자 이름, 문자열 암호); } public static void main (String [] args)은 예외를 {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 ()); }} Java8 이전에는 일부 수단을 통해 매개 변수 이름 정보를 얻을 수 있지만 방법은 다릅니다. 예를 들어, Spring MVC의 ParameterMethodNameResolver 이전 버전에서 정상적으로 작동 할 수 있습니다. 그러나 특별한 편집 만 있으면됩니다. 여기서 작동하는 것은 LocalVariableTable 및 MethodParameters 이며, 이는 중국어의 로컬 변수 테이블 및 메소드 매개 변수 테이블로 컴파일됩니다.
LocalVariabletable 로컬 변수 테이블
JVM 사양에 따르면 로컬 변수 테이블은 코드 속성에 존재하며 코드 속성은 MethodInfo의 속성이기도합니다. 메소드에 메소드 본문이 있으면 해당 코드 속성이 나타납니다. 코드 속성에는 특정 코드 실행 외에도 다른 정보가 있습니다. 예를 들어 LineNumberTable (각 코드 라인의 위치를 설명하는 데 사용).
로컬 변수 테이블은 메소드의 디버깅 정보의 일부이므로 기본적 으로이 정보는 클래스 파일에서 생성되지 않습니다. -g 또는 -g : vars 스위치를 켜야합니다. 다행히도 IDE 또는 Maven 컴파일의 경우이 스위치가 기본적으로 켜집니다. IDE에서는 설정 (아이디어에 대한 디버깅 정보 생성) (기본 점검)을 설정하여 제어 할 수 있습니다. Maven에서는 플러그인 Maven-Compiler-Plugin의 디버깅 또는 디버그 범벨에 의해 출력이 제어되는지 여부 (기본값은 true).
로컬 변수 테이블은 다음과 같이 Javap 이후입니다.
// 비 정적 메소드 LocalVariableTable : 시작 길이 슬롯 이름 서명 0 1 0이 lt; 0 1 1 Count J 0 1 3 이름 ljava/lang/string; // 정적 메소드 LocalVariableTable : 시작 길이 슬롯 이름 서명 0 101 0 Args [ljava/lang/string;
로컬 변수 테이블은 매개 변수 정보를 저장할뿐만 아니라 선언 된 int I 등과 같이 전체 메소드 본문에서 사용될 수있는 임시 변수를 저장하며, 메소드와 비 정적 방법은 첫 번째 위치 에서이 변수간에 차이가 있습니다. 따라서 매개 변수 수 ( method.getParameterCount )를 읽은 다음 메소드 서명에 따라 로컬 변수 테이블에서 지정된 숫자의 매개 변수 정보를 읽을 수 있습니다.
위의 그림에서 매개 변수가 길거나 두 배나이면 슬롯이 2 곳을 차지합니다. 슬롯을 통해 매개 변수 정보를 얻을 때 매개 변수 유형 정보를 고려해야합니다.
인터페이스 메소드에는 코드 속성이 없으므로 로컬 변수 테이블이 없습니다. 인터페이스의 메소드 정의를 얻으면 로컬 변수 테이블을 통해 해당 매개 변수 이름을 얻을 수 없습니다.
MethodParameters 메소드 매개 변수 테이블
메소드 파라미터 테이블은 1.8 이후에 도입 되었으므로이 정보는 JDK8로 컴파일 된 클래스 파일에서만 사용할 수 있습니다. 로컬 변수 테이블과 달리 MethodInfo 속성에 속합니다. 즉, 코드 속성과 동일한 수준입니다. 인터페이스 방법이든 일반적인 방법이든이 속성이 있습니다. 따라서 인터페이스 방법조차도 해당 매개 변수 정보를 얻을 수 있습니다.
기본적 으로이 정보는 클래스에서 사용할 수 없습니다. 특수 컴파일 매개 변수 -Parameters가 생성해야 하며이 정보는 아이디어와 Maven에서 기본적으로 생성되지 않습니다. 아이디어 에서이 컴파일 매개 변수는 Java 추가 라인 매개 변수로 추가되어야합니다. Maven 에서이 매개 변수는 Maven-Compiler-Plugin의 compilerArgs 매개 변수에 추가되어야합니다.
메소드 매개 변수 테이블은 Javap 다음에 다음 형식으로 표시됩니다.
// 비 정적 메소드 메소드 메소드 파라미터 : 이름 플래그 카운트 이름 // 정적 메소드 메소드 파라 메테르 : 이름 플래그 args
정적이든 아니든 매개 변수를 설명하는 데 사용되는 정보 만 매개 변수 테이블에 나타납니다. 다음 플래그 매개 변수는 메소드 재 작성의 final 매개 변수 등과 같은 일부 특수 시나리오에서 사용됩니다.
사용 가능한 일부 도구
기본 API 및 스프링 툴킷을 사용하는 것 외에도 매개 변수 이름 정보를 얻을 수있는 다른 도구가 있습니다. 스프링 시스템에서 매개 변수 이름을 설명하는 데 사용되는 인터페이스는 ParameterNameDiscoverer 입니다. 이를 통해 해당 매개 변수 이름 정보를 얻을 수 있습니다. 또한 com.thoughtworks.paranamer:paranamer Toolkit도 해당 정보를 처리 할 수 있습니다. 그러나 JDK8 MethodParameters에 대한 지원은 그다지 높지 않으며 사용자는 확장하여 자체 목표를 달성 할 수 있습니다.
요약
위는 귀하가 요약 한 Java 코드의 매개 변수 이름 정보를 얻는 방법입니다. Java를 배우거나 사용하는 데 도움이되기를 바랍니다. 궁금한 점이 있으면 의사 소통을 위해 메시지를 남길 수 있습니다.