Heim >Java >javaLernprogramm >Java-Methode zum Abrufen von Informationen zum Methodenparameternamen im Code

Java-Methode zum Abrufen von Informationen zum Methodenparameternamen im Code

高洛峰
高洛峰Original
2017-01-22 10:46:022730Durchsuche

Vorwort

Jeder weiß, dass mit der Verwendung von Java8 ein neuer Objektparameter zur entsprechenden Methodensignatur hinzugefügt wurde, um spezifische Parameterinformationen darzustellen. Der entsprechende Parametername kann über seinen getName abgerufen werden Wenn es im Code geschrieben ist und Benutzername heißt, müssen beim Übergeben von Parametern an der Rezeption keine Anmerkungen wie @Parameter ("Benutzername") geschrieben werden, und die namensbasierte Zuordnung kann direkt durchgeführt werden .

Die folgende Codereferenz wird angezeigt:

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());
 }
}

Vor Java8 konnten Parameternameninformationen auch auf irgendeine Weise abgerufen werden, aber die Methode war Anders. Beispielsweise kann der ParameterMethodNameResolver in früheren Versionen auch normal funktionieren. Hier sind LocalVariableTable und MethodParameters erforderlich, die in chinesischen Variablentabellen und Methodenparametertabellen kompiliert werden

LocalVariableTable lokale Variablentabelle

Gemäß der JVM-Spezifikation ist die lokale Variablentabelle im Code-Attribut vorhanden, und das Code-Attribut ist ein Attribut von methodInfo. Dies kann verstanden werden, wenn eine Methode eine Methode hat body, Das entsprechende Code-Attribut wird angezeigt, und im Code-Attribut werden zusätzlich zum spezifischen Ausführungscode auch andere Informationen angezeigt, z. B. LineNumberTable (wird zur Beschreibung der Position jeder Codezeile verwendet). 🎜> Lokale Variablen Die Tabelle ist Teil der Debugging-Informationen in der Methode, daher werden diese Informationen standardmäßig nicht in der Klassendatei generiert. Glücklicherweise müssen Sie für IDE oder Maven-Kompilierung, diese Schalter sind alle standardmäßig aktiviert. In der IDE können Sie sie steuern, indem Sie (Standard-Häkchen) festlegen, ob die Ausgabe per Debug oder DebugLevel erfolgen soll -in Maven-Compiler-Plugin. (Der Standardwert ist true).

Die lokale Variablentabelle ist nach Javap, wie unten gezeigt:

//非静态方法
  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;
Die Die lokale Variablentabelle speichert nicht nur Parameterinformationen, sondern auch temporäre Variablen, die im gesamten Methodenkörper verwendet werden können, z. B. das deklarierte int i usw. Und wie oben gezeigt, gibt es einen Unterschied zwischen dieser Variablen und der ersten Platz zwischen der Ausdrucksmethode und der nicht statischen Methode. Daher können Sie die Parameter nach Nummer (method.getParameterCount) lesen und dann die angegebene Anzahl von Parameterinformationen in der lokalen Variablentabelle gemäß der Methodensignatur lesen

Es ist zu beachten, dass in der obigen Abbildung, wenn der Parameter lang oder doppelt ist und sein Steckplatz 2 Leerzeichen einnimmt, beim Abrufen von Parameterinformationen über den Steckplatz die Typinformationen des Parameters berücksichtigt werden müssen.


Da die Schnittstellenmethode kein Codeattribut hat, verfügt sie nicht über eine lokale Variablentabelle. Zur Methodendefinition einer Schnittstelle kann der entsprechende Parametername nicht über die lokale Variablentabelle abgerufen werden

MethodParameters Die Methodenparametertabelle

Die Methodenparametertabelle wurde nach 1.8 eingeführt, also verwenden Sie einfach jdk8. Im Gegensatz zur lokalen Variablentabelle enthält sie nur diese Informationen, die zum MethodInfo-Attribut gehören Das heißt, es befindet sich auf derselben Ebene wie das Code-Attribut. Daher können Sie auch für Schnittstellenmethoden die entsprechenden Parameterinformationen abrufen Standardmäßig gibt es in der Klasse keine solchen Informationen. Sie müssen spezielle Kompilierungsparameter verwenden, und in ide und maven werden diese Informationen standardmäßig nicht generiert. Sie müssen diesen Kompilierungsparameter in Java hinzufügen Zusätzliche Zeilenparameter. In Maven müssen Sie diesen Parameter auch im Parameter „compilerArgs“ des Maven-Compiler-Plugins hinzufügen. Die Methodenparametertabelle hat nach Javap die folgende Form:

Es ist ersichtlich, dass in der Parametertabelle unabhängig davon, ob sie statisch ist oder nicht, nur die zur Beschreibung der Parameter verwendeten Parameter angezeigt werden. Die folgenden Flags-Parameter werden in einigen speziellen Szenarien verwendet B. endgültige Parameter für das Umschreiben von Methoden usw.

Einige Tools, die verwendet werden können

Zusätzlich zur Verwendung der nativen API und des Spring-Toolkits gibt es andere Tools, die Informationen zu Parameternamen abrufen können Im Spring-System ist die zum Beschreiben von Parameternamen verwendete Schnittstelle ParameterNameDiscoverer. Darüber hinaus kann com.thoughtworks.paranamer:paranamer auch entsprechende Informationen verarbeiten , die Unterstützung für die Methodenparameter von jdk8 ist nicht sehr hoch, und Benutzer können ihre eigenen Zwecke erreichen, indem sie sie erweitern

//非静态方法
 MethodParameters:
  Name       Flags
  count
  name
  
//静态方法
 MethodParameters:
  Name       Flags
  args

Zusammenfassung

Das Obige ist eine Zusammenfassung, wie Java den Methodenparameternamen erhält Ich hoffe, dass die Informationen im Code für alle beim Erlernen oder Verwenden von Java hilfreich sind. Wenn Sie Fragen haben, können Sie eine Nachricht hinterlassen.

Weitere Artikel zu Javas Methode zum Abrufen von Informationen zu Methodenparameternamen im Code finden Sie auf der chinesischen PHP-Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn