Prefacio
Todos saben que con el uso de Java8, se ha agregado un nuevo parámetro de objeto a la firma del método correspondiente para representar información de parámetros específica. El nombre del parámetro correspondiente se puede obtener a través de su nombre de GetName. Es decir, como escrito en el código, como el nombre de usuario, al pasar los parámetros en primer plano, no hay necesidad de escribir anotaciones como @parameter ("nombre de usuario"), pero puede mapear directamente por su nombre.
Se muestra la siguiente referencia del código:
Public Class T {Interfaz privada T2 {método void (string username, string contraseña); } public static void main (string [] args) lanza la excepción {system.out.println (t.class.getMethod ("main", string []. class) .getParameters () [0] .getName ()); System.out.println (t2.class.getMethod ("método", string.class, string.class) .getParameters () [0] .getName ()); System.out.println (t2.class.getMethod ("método", string.class, string.class) .getParameters () [1] .getName ()); }} Antes de Java8, también puede obtener información de nombre de parámetros a través de algunos medios, pero los métodos son diferentes. Por ejemplo, ParameterMethodNameResolver en Spring MVC también puede funcionar normalmente en versiones anteriores. Sin embargo, solo requiere una compilación especial. Lo que funciona aquí son LocalVariableTable y MethodParameters , que se compilan en tablas variables locales y tablas de parámetros de método en chino.
Tabla de variables locales localizable
De acuerdo con la especificación JVM, la tabla de variables locales existe en el atributo de código, y el atributo de código también es un atributo de MethodInfo. Se puede entender que cuando un método tiene un cuerpo de método, aparecerá el atributo de código correspondiente. En el atributo de código, además de la ejecución específica del código, habrá otra información. Por ejemplo, LinenumberTable (utilizado para describir la ubicación de cada línea de código).
La tabla de variables locales es parte de la información de depuración en el método, por lo que de manera predeterminada, esta información no se generará en el archivo de clase. Los interruptores -g o -g: Vars deben activarse. Afortunadamente, para la compilación IDE o Maven, estos interruptores se activan de forma predeterminada. En IDE, puede controlarlo configurando (generar información de depuración para la idea) (verificación predeterminada). En Maven, si la salida se controla mediante depuración o nivel de depuración en el plugin-compiler-plugin enchufable (el valor predeterminado es verdadero).
La tabla de variables locales es después de Javap, como sigue:
// Método no estático LocalVariaBletable: Firma de la ranura de longitud de inicio 0 1 0 este LT; 0 1 1 cuenta j 0 1 3 nombre ljava/lang/string; // Método estático LocalVariaBletable: Longitud de inicio Nombre de la ranura Firma 0 101 0 Args [ljava/lang/string;
La tabla de variables locales no solo guarda información de parámetros, sino que también almacena variables temporales que pueden usarse en todo el cuerpo del método, como el int I declarado int i, etc. y como se muestra anteriormente, el método y el método no estático tienen una diferencia entre esta variable en la primera posición. Por lo tanto, puede leer el número de parámetros ( method.getParameterCount ), y luego leer la información de parámetros del número especificado en la tabla de variables locales de acuerdo con la firma del método.
Cabe señalar que en la figura anterior, si el parámetro es largo o doble, su ranura ocupa 2 lugares. Al obtener información de parámetros a través de la ranura, se debe considerar la información del tipo de parámetro.
Dado que el método de interfaz no tiene atributo de código, no hay una tabla de variables locales. Si obtiene la definición del método de una interfaz, no puede obtener el nombre del parámetro correspondiente a través de la tabla de variables locales.
MethodParameters Tabla de parámetros del método
La tabla de parámetros del método se introdujo después de 1.8, por lo que esta información solo está disponible en archivos de clase compilados con JDK8. A diferencia de la tabla de variables locales, pertenece al atributo MethodInfo, es decir, está al mismo nivel que el atributo de código. Ya sea que se trate de un método de interfaz o un método ordinario, tiene este atributo. Por lo tanto, incluso un método de interfaz puede obtener la información del parámetro correspondiente.
Por defecto, esta información no está disponible en la clase. Se requiere un parámetro de compilación especial -Parámetros para generar, y esta información no se genera de forma predeterminada en Idea y Maven. En idea, este parámetro de compilación debe agregarse en los parámetros de línea adicionales de Java. En Maven, este parámetro debe agregarse en el parámetro compilerArgs de Maven-Compiler-Plugin.
La tabla de parámetros del método se muestra en el siguiente formulario después de Javap:
// Método no estático Método Paraméteres: Nombre Nombre del conteo de los indicadores // Método estático Método Parámetros: Nombre Flags Args
Se puede ver que si es estático o no, solo la información utilizada para describir los parámetros aparecerá en la tabla de parámetros. El parámetro de indicadores posteriores se usa en algunos escenarios especiales, como el parámetro final para la reescritura de métodos, etc.
Algunas herramientas disponibles
Además de usar API nativas y kits de herramientas de resorte, existen otras herramientas que pueden obtener información de nombre de parámetros. En el sistema de resorte, la interfaz utilizada para describir los nombres de los parámetros es ParameterNameDiscoverer . A través de ella, se puede obtener la información del nombre del parámetro correspondiente. Además, el paranamer en com.thoughtworks.paranamer:paranamer también puede procesar la información correspondiente. Sin embargo, el soporte para MethodParameters JDK8 no es muy alto, y los usuarios pueden lograr sus propios objetivos al extenderlo.
Resumir
Lo anterior es el método para obtener la información del nombre del parámetro del método en el código resumido por Java. Espero que sea útil para todos aprender o usar Java. Si tiene alguna pregunta, puede dejar un mensaje para comunicarse.