Declaración del problema:
¿Se puede utilizar Java Reflection para recuperar los nombres de variables declaradas localmente? Dado un fragmento de código como:
Foo b = new Foo(); Foo a = new Foo(); Foo r = new Foo();
¿Podemos desarrollar un método que identifique los nombres de las variables, como:
public void baz(Foo... foos) { for (Foo foo : foos) { // Print the name of each foo - b, a, and r System.out.println(***); // Placeholder for variable name access } }
Solución:
Hasta Java 8, no era posible recuperar nombres de variables locales mediante reflexión. Sin embargo, se introdujo soporte parcial en esa versión. Los nombres de los parámetros, un tipo especializado de variables locales, se volvieron accesibles a través de la reflexión. Esto resultó útil para reemplazar anotaciones como @ParameterName, comúnmente empleadas por los marcos de inyección de dependencia.
Para obtener información más completa sobre los nombres de las variables locales, examinar los archivos de clase puede ofrecer algunas ideas. Durante la compilación, las técnicas de optimización a veces eliminan estos datos para ahorrar espacio. Sin embargo, si existe, el atributo de tabla de variables locales de un método enumera los tipos y nombres de las variables dentro de sus respectivos alcances de instrucción.
Las herramientas de ingeniería de código de bytes como ASM pueden proporcionar mecanismos para inspeccionar esta información en tiempo de ejecución. Dada la aplicación específica de esta capacidad principalmente en entornos de desarrollo, dichas bibliotecas ofrecen capacidades complementarias más allá de la mera extracción de nombres de variables.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3