Avant-propos
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ètre spécifiques. Le nom du paramètre correspondant peut être obtenu via son getName .C'est-à-dire. , s'il est écrit dans le code, s'il est nommé nom d'utilisateur, alors lors de la transmission des paramètres à la réception, il n'est pas nécessaire d'écrire des annotations telles que @Parameter("username"), et le mappage basé sur le nom peut être effectué directement .
La référence de code suivante est affichée :
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()); } }
Avant Java8, les informations sur le nom du paramètre pouvaient également être obtenues par certains moyens, mais la méthode était différent. Par exemple, le ParameterMethodNameResolver dans spring mvc peut également fonctionner normalement dans les versions précédentes, mais il nécessite une compilation spéciale. Ce qui fonctionne ici, ce sont LocalVariableTable et MethodParameters, qui sont compilés en tables de variables locales et en tables de paramètres de méthode en chinois.
Table des variables locales LocalVariableTableSelon la spécification jvm, la table des variables locales existe dans l'attribut Code, et l'attribut Code est un attribut de methodInfo. On peut comprendre que lorsqu'une méthode a une méthode. body, L'attribut Code correspondant apparaîtra, et dans l'attribut code, en plus du code d'exécution spécifique, il y aura également d'autres informations telles que LineNumberTable (utilisée pour décrire l'emplacement de chaque ligne de code<). 🎜> Variables locales Le tableau 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. Vous devez activer le commutateur -g ou -g:vars Heureusement, pour l'IDE ou. compilation maven, ces commutateurs sont tous activés par défaut. Dans l'IDE, vous pouvez le contrôler en définissant (générer des informations de débogage pour une idée) (coche par défaut dans maven, vous pouvez contrôler s'il faut sortir par debug ou debugLevel dans le plug). -in maven-compiler-plugin. (La valeur par défaut est true).
La table des variables locales est après javap, comme indiqué ci-dessous :
//非静态方法 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;
Le La table de variables locales enregistre non seulement les informations sur les paramètres, mais également des variables temporaires qui peuvent être utilisées dans l'ensemble du corps de la méthode, telles que l'int i déclaré, etc. Et comme indiqué ci-dessus, il existe une différence dans la variable this dans le premier place entre la méthode d'expression et la méthode non statique. Par conséquent, vous pouvez lire les paramètres par numéro (method.getParameterCount), puis lire le nombre spécifié d'informations sur les paramètres dans la table des variables locales en fonction de la signature de la méthode
.
Il convient de noter que dans la figure ci-dessus, si le paramètre Il est long ou double et que son emplacement occupe 2 emplacements Lors de l'obtention d'informations sur les paramètres via l'emplacement, vous devez prendre en compte les informations de type du paramètre.
Comme la méthode d'interface n'a pas d'attribut de code, elle n'a pas de table de variables locales. Pour la définition de méthode d'une interface, le nom du paramètre correspondant ne peut pas être obtenu via la table de variables locales
MethodParameters La table des paramètres de méthode
La table des paramètres de méthode a été introduite après la version 1.8, utilisez donc simplement jdk8. Seul le fichier de classe compilé contient ces informations. Contrairement à la table de variables locales, il appartient à l'attribut MethodInfo, qui. c'est-à-dire qu'il est au même niveau que l'attribut Code. Qu'il s'agisse d'une méthode d'interface ou d'une méthode ordinaire, elle a donc cet attribut, même pour les méthodes d'interface, vous pouvez obtenir les informations sur les paramètres correspondants
. Par défaut, il n'y a pas de telles informations dans la classe. Vous devez utiliser des paramètres de compilation spéciaux - des paramètres à générer, et dans ide et maven, ces informations ne seront pas générées par défaut. Dans l'idée, vous devez ajouter ce paramètre de compilation en java. paramètres de ligne supplémentaires. Dans maven, vous devez également ajouter ce paramètre dans le paramètre compilerArgs de maven-compiler-plugin
Le tableau des paramètres de méthode se présente sous la forme suivante après javap :
<. 🎜>
//非静态方法 MethodParameters: Name Flags count name //静态方法 MethodParameters: Name Flags args
Résumé