Préface
Tout le monde sait qu'avec l'utilisation de Java8, un nouveau paramètre d'objet a été ajouté à la signature de la méthode correspondante pour représenter des informations de paramètres spécifiques. Le nom du paramètre correspondant peut être obtenu via son getName. Autrement dit, comme écrit dans le code, tel que le nom d'utilisateur, lors du passage des paramètres au premier plan, il n'est pas nécessaire d'écrire des annotations telles que la classe @paramètre ("nom d'utilisateur"), mais peut dire directement par nom.
La référence de code suivante est affichée:
classe publique t {interface privée t2 {void Method (String Username, String Motword); } public static void main (String [] args) lève une exception {System.out.println (t.class.getMethod ("main", string []. class) .getParameters () [0] .getName ()); System.out.println (t2.class.getMethod ("méthode", string.class, string.class) .getParameters () [0] .getName ()); System.out.println (t2.class.getMethod ("méthode", string.class, string.class) .getParameters () [1] .getName ()); }} Avant Java8, vous pouvez également obtenir des informations sur le nom des paramètres par certains moyens, mais les méthodes sont différentes. Par exemple, ParameterMethodNameResolver dans le printemps MVC peut également fonctionner normalement dans les versions précédentes. Cependant, cela ne nécessite qu'une compilation spéciale. Ce qui fonctionne ici, ce sont LocalVariableTable et MethodParameters , qui sont compilés dans des tables variables locales et des tables de paramètres de méthode en chinois.
Table variable locale localvariabletable
Selon la spécification JVM, la table de variable locale existe dans l'attribut de code et l'attribut de code est également un attribut de MethodInfo. On peut comprendre que lorsqu'une méthode a un corps de méthode, l'attribut de code correspondant apparaîtra. Dans l'attribut de code, en plus de l'exécution de code spécifique, il y aura d'autres informations. Par exemple, LineNumberTable (utilisé pour décrire l'emplacement de chaque ligne de code).
La table variable locale fait partie des informations de débogage dans la méthode, donc par défaut, ces informations ne seront pas générées dans le fichier de classe. Les commutateurs -g ou -g: VARS doivent être activés. Heureusement, pour la compilation IDE ou Maven, ces commutateurs sont activés par défaut. Dans IDE, vous pouvez le contrôler en définissant (générer des informations de débogage pour l'idée) (vérification par défaut). Dans Maven, que la sortie soit contrôlée par débogage ou debuglevel dans le plug-in Maven-Compiler-Plugin (la valeur par défaut est vraie).
La table variable locale est après Javap, comme suit:
// Méthode non statique LocalVariabeLtable: Démarrage du nom de l'emplacement Signature 0 1 0 Ce lt; 0 1 1 COUNT J 0 1 3 Name Ljava / Lang / String; // Méthode statique LocalVariabeTable: Signature du nom de l'emplacement de la longueur de démarrage 0 101 0 Args [ljava / lang / string;
Le tableau des variables locales enregistre non seulement les informations des paramètres, mais stocke également des variables temporaires qui peuvent être utilisées dans l'ensemble du corps de la méthode, telles que l'INT I, etc. et comme indiqué ci-dessus, la méthode et la méthode non statique ont une différence entre cette variable dans la première position. Par conséquent, vous pouvez lire le nombre de paramètres ( method.getParameterCount ), puis lire les informations des paramètres du numéro spécifié dans la table de variable locale en fonction de la signature de la méthode.
Il convient de noter que dans la figure ci-dessus, si le paramètre est long ou double, sa machine à sous occupe 2 places. Lors de l'obtention d'informations sur les paramètres via l'emplacement, les informations de type de paramètre doivent être prises en compte.
Étant donné que la méthode d'interface n'a pas d'attribut de code, il n'y a pas de table de variable locale. Si vous obtenez la définition de la méthode d'une interface, vous ne pouvez pas obtenir le nom du paramètre correspondant via la table de variable locale.
Table des paramètres de méthode méthode méthode
Le tableau des paramètres de méthode a été introduit après 1,8, de sorte que ces informations sont disponibles uniquement dans les fichiers de classe compilés avec JDK8. Contrairement à la table variable locale, elle appartient à l'attribut MethodInfo, c'est-à-dire qu'elle est au même niveau que l'attribut de code. Qu'il s'agisse d'une méthode d'interface ou d'une méthode ordinaire, il a cet attribut. Par conséquent, même une méthode d'interface peut obtenir les informations de paramètre correspondantes.
Par défaut, ces informations ne sont pas disponibles dans la classe. Un paramètre de compilation spécial -paramètres est nécessaire pour générer, et ces informations ne sont pas générées par défaut dans Idea et Maven. Dans l'idée, ce paramètre de compilation doit être ajouté dans les paramètres de ligne supplémentaires Java. Dans Maven, ce paramètre doit être ajouté dans le paramètre compilerArgs de Maven-Compiler-Plugin.
Le tableau des paramètres de méthode est illustré dans la forme suivante après Javap:
// Méthode non statique Méthode Paramètres: Nom Flags Count Nom // Méthode statique Méthode PARAMètres: Nom Flags Args
On peut voir que si elle est statique ou non, seules les informations utilisées pour décrire les paramètres apparaîtront dans le tableau des paramètres. Le paramètre Flags ultérieur est utilisé dans certains scénarios spéciaux, tels que le paramètre final pour la réécriture de la méthode, etc.
Quelques outils disponibles
En plus d'utiliser des API natives et des boîtes à outils Spring, il existe d'autres outils qui peuvent obtenir des informations sur le nom du paramètre. Dans le système de ressort, l'interface utilisée pour décrire les noms de paramètres est ParameterNameDiscoverer . Grâce à celui-ci, les informations de nom de paramètre correspondantes peuvent être obtenues. De plus, le paranamère dans com.thoughtworks.paranamer:paranamer peut également traiter les informations correspondantes. Cependant, la prise en charge de JDK8 MethodParameters n'est pas très élevée et les utilisateurs peuvent atteindre leurs propres objectifs en l'étendant.
Résumer
Ce qui précède est la méthode d'obtention des informations de nom de paramètre de méthode dans le code résumé par Java. J'espère qu'il sera utile à tout le monde d'apprendre ou d'utiliser Java. Si vous avez des questions, vous pouvez laisser un message pour communiquer.