que - reflection java stack overflow
Obtener el nombre de un parámetro de método (7)
¿Eres dueño del código del método? Podría anotar los parámetros y pasar nombres como argumentos @Param("slice1")
. Más adelante, podrá obtener la anotación y extraer el nombre del parámetro.
En Java 6 , imagina que tengo la siguiente firma de método:
public void makeSandwich(Bread slice1, Bread slice2, List<Filling> fillings, boolean mustard)
Me gustaría saber, en tiempo de ejecución, el valor que se pasó a slice2
o cualquier otro parámetro, el bit importante aquí es que quiero obtener el valor por nombre de parámetro.
Sé cómo obtener la lista de tipos de parámetros con getParameterTypes
o getGenericParameterTypes
.
Idealmente, me gustaría obtener una lista de nombres de parámetros en lugar de tipos. ¿Hay una manera de hacerlo?
Además de this respuesta: "Los nombres de los parámetros están disponibles si le ha dicho al compilador que los incluya"
Si está utilizando Eclipse, vaya al proyecto -> propiedades -> Compilador de Java -> marque "Almacenar información sobre los parámetros del método (utilizable mediante reflexión)
En Java, los nombres de parámetros no están disponibles a través de la reflexión.
Esto no es posible. Los archivos de clase no contienen los nombres de los argumentos, como puede ver con el autocompletado de su IDE cuando la fuente no está disponible.
Por lo tanto, la API de reflexión no puede dar nombres de parámetros.
He encontrado otra solución después de marcar esta pregunta como respondida. La solución es Paranamer .
Ejemplo:
Method method = Foo.class.getMethod(...);
Paranamer paranamer = new CachingParanamer();
String[] parameterNames = paranamer.lookupParameterNames(method) // throws ParameterNamesNotFoundException if not found
// or ...
parameterNames = paranamer.lookupParameterNames(method, false) // will return null if not found
Los nombres de los parámetros están disponibles si le ha dicho al compilador que los incluya (compile con información de depuración). Spring tiene ParameterNameDiscoverer
que puede ayudarte a obtener los nombres. La implementación predeterminada utiliza asm ClassReader
para hacerlo.
Con javac
debes incluir el argumento -g
para incluir información de depuración. Con Eclipse creo que está ahí por defecto; se puede configurar usando las preferencias: Java -> Compilador y luego habilite "Almacenar información sobre los parámetros del método (utilizable a través de la reflexión)" (vea también esta respuesta ).
Algunos marcos usan esto. Por ejemplo, spring-mvc tiene @RequestParam
que por defecto es el nombre del parámetro, si es resoluble. También admite la denominación explícita - @RequestParam("foo")
en caso de que no se proporcione información de depuración.
Simplemente puede asignar el valor del parámetro a otro valor
Bread slice2;
public void makeSandwich(Bread slice1, Bread slice2, List<Filling> fillings, boolean mustard) {
this.slice2 = slice2;
System.out.println(this.slice2.getSomething());
}