Vorwort
Jeder weiß, dass mit der Verwendung von Java8 der entsprechenden Methodensignatur ein neuer Objektparameter hinzugefügt wurde, um spezifische Parameterinformationen darzustellen. Der entsprechende Parametername kann durch seinen GetName erhalten werden. Das heißt, wie im Code wie Benutzernamen geschrieben, wenn Parameter im Vordergrund über die Übergabe von Anmerkungen wie @Parameter ("Benutzername") Klasse geschrieben werden, können jedoch direkt nach Namen zugeordnet werden.
Die folgende Codereferenz ist angezeigt:
öffentliche Klasse T {private Schnittstelle T2 {void -Methode (String -Benutzername, String -Passwort); } public static void main (String [] args) löst eine Ausnahme aus {System.out.println (t.class.getMethod ("Main", String []. Klasse) .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 können Sie auch über einige Weise Parameternameninformationen abrufen, die Methoden sind jedoch unterschiedlich. Beispielsweise kann ParameterMethodNameResolver in Spring MVC auch in früheren Versionen normal funktionieren. Es erfordert jedoch nur eine spezielle Zusammenstellung. Was hier funktioniert, sind LocalVariableTable und MethodParameters , die in lokalen variablen Tabellen und Methodenparametertabellen in Chinesisch zusammengestellt werden.
LOCALVARIABLETABLE LOCAL VARIABLE TABELLE
Gemäß der JVM -Spezifikation existiert die lokale Variable -Tabelle im Codeattribut, und das Code -Attribut ist auch ein Attribut von MethodInfo. Es ist zu verstehen, dass das entsprechende Codeattribut, wenn eine Methode eine Methode hat, das entsprechende Code -Attribut erscheint. Im Code -Attribut finden Sie zusätzlich zur spezifischen Codeausführung weitere Informationen. Zum Beispiel Leinenumbertable (verwendet, um die Position jeder Codezeile zu beschreiben).
Die lokale variable Tabelle ist Teil der Debugging -Informationen in der Methode. Standardmäßig werden diese Informationen nicht in der Klassendatei generiert. Die Switches -G oder -G: Vars müssen eingeschaltet werden. Glücklicherweise werden diese Schalter für die IDE- oder Maven -Zusammenstellung standardmäßig eingeschaltet. In IDE können Sie es steuern, indem Sie einstellen (Debugging -Informationen für Idee generieren) (Standardprüfung). In Maven wird die Ausgabe durch Debugging oder Debuglevel im Plug-in Maven-Compiler-Plugin gesteuert (der Standardwert ist wahr).
Die lokale variable Tabelle erfolgt nach Javap wie folgt:
// Nichtstatische Methode localVariabletable: Startlängenschlitzname Signatur 0 1 0 Dieser LT; 0 1 1 count J 0 1 3 Name Ljava/Lang/String; // statische Methode localVariabletable: Startlänge Slot -Name Signatur 0 101 0 Args [ljava/lang/String;
Die lokale Variable-Tabelle speichert nicht nur Parameterinformationen, sondern speichert auch temporäre Variablen, die in der gesamten Methodekörper verwendet werden können, wie z. Daher können Sie die Anzahl der Parameter ( method.getParameterCount ) lesen und dann die Parameterinformationen der angegebenen Zahl in der lokalen Variablen -Tabelle gemäß der Methodensignatur lesen.
Es ist zu beachten, dass in der obigen Abbildung, wenn der Parameter lang oder doppelt ist, sein Steckplatz 2 Plätze einnimmt. Bei der Erfassung von Parameterinformationen über den Steckplatz muss die Parametertypinformationen berücksichtigt werden.
Da die Schnittstellenmethode kein Codeattribut hat, gibt es keine lokale variable Tabelle. Wenn Sie die Methodendefinition einer Schnittstelle erhalten, können Sie den entsprechenden Parameternamen nicht über die lokale Variable -Tabelle abrufen.
MethodParameters Method Parameter Tabelle
Die Methodenparametertabelle wurde nach 1.8 eingeführt, sodass diese Informationen nur in Klassendateien verfügbar sind, die mit JDK8 zusammengestellt wurden. Im Gegensatz zur lokalen variablen Tabelle gehört es zum MethodInfo -Attribut, dh auf der gleichen Ebene wie das Code -Attribut. Unabhängig davon, ob es sich um eine Schnittstellenmethode oder eine gewöhnliche Methode handelt, hat es dieses Attribut. Daher kann sogar eine Schnittstellenmethode die entsprechenden Parameterinformationen erhalten.
Standardmäßig sind diese Informationen in der Klasse nicht verfügbar. Eine spezielle Kompilierungsparameter -Parameter ist erforderlich, um zu generieren, und diese Informationen werden nicht standardmäßig in Idea und Maven generiert. In der Idee muss dieser Kompilierungsparameter in den zusätzlichen Zeilenparametern von Java hinzugefügt werden. In Maven muss dieser Parameter im compilerArgs Parameter von Maven-Compiler-Plugin hinzugefügt werden.
Die Methodeparametertabelle ist in der folgenden Form nach Javap gezeigt:
// Nichtstatische Methodenmethodenmethodenparameter: Name Flags Kennzeichen Name // statische Methode MethodParameters: Name Flags Argumente
Es ist zu erkennen, dass unabhängig davon, ob es statisch ist oder nicht, nur Informationen zur Beschreibung der Parameter in der Parametertabelle angezeigt werden. Der folgende Flags -Parameter wird in einigen speziellen Szenarien verwendet, z. B. dem final Parameter für das Umschreiben von Methoden usw.
Einige Tools verfügbar
Zusätzlich zur Verwendung von nativen APIs und Feder -Toolkits gibt es andere Tools, mit denen die Parameternameninformationen abgerufen werden können. Im Federsystem ist die Schnittstelle zur Beschreibung der Parameternamen ParameterNameDiscoverer . Dadurch können die entsprechenden Parameternameninformationen erhalten werden. Darüber hinaus kann der Paranamer im com.thoughtworks.paranamer:paranamer Toolkit entsprechende Informationen verarbeiten. Die Unterstützung von JDK8 Methodparametern ist jedoch nicht sehr hoch, und Benutzer können ihre eigenen Ziele erreichen, indem sie diese erweitern.
Zusammenfassen
Das obige ist die Methode, um die von Ihnen zusammengefassten Java -Code zu erhalten. Ich hoffe, es wird Ihnen helfen, Java zu lernen oder zu verwenden. Wenn Sie Fragen haben, können Sie eine Nachricht zur Kommunikation überlassen.