Si tengo una clase como esta:
public class Whatever
{
public void aMethod(int aParam);
}
¿Hay alguna manera de saber que aMethod
usa un parámetro llamado aParam
, que es de tipo int
?
java
reflection
Geo
fuente
fuente
Respuestas:
Para resumir:
method.getParameterTypes()
En aras de escribir la funcionalidad de autocompletar para un editor (como mencionó en uno de los comentarios), hay algunas opciones:
arg0
,arg1
,arg2
etc.intParam
,stringParam
,objectTypeParam
, etc.fuente
En Java 8 puede hacer lo siguiente:
Entonces, para su clase
Whatever
, podemos hacer una prueba manual:que debería imprimirse
[aParam]
si ha pasado el-parameters
argumento a su compilador Java 8.Para usuarios de Maven:
Para obtener más información, consulte los siguientes enlaces:
fuente
La biblioteca Paranamer fue creada para resolver este mismo problema.
Intenta determinar los nombres de los métodos de diferentes maneras. Si la clase se compiló con depuración, puede extraer la información leyendo el código de bytes de la clase.
Otra forma es inyectar un miembro estático privado en el código de bytes de la clase después de compilarlo, pero antes de colocarlo en un jar. Luego usa la reflexión para extraer esta información de la clase en tiempo de ejecución.
https://github.com/paul-hammant/paranamer
Tuve problemas al usar esta biblioteca, pero al final lo hice funcionar. Espero informar los problemas al mantenedor.
fuente
ParameterNAmesNotFoundException
vea la clase org.springframework.core.DefaultParameterNameDiscoverer
fuente
Si.
Código debe ser compilado con Java 8 compilador compatible con la opción de almacenar nombres de parámetros formales activada ( -parámetros opción).
Entonces este fragmento de código debería funcionar:
fuente
Puede recuperar el método con reflexión y detectar sus tipos de argumento. Verifique http://java.sun.com/j2se/1.4.2/docs/api/java/lang/reflect/Method.html#getParameterTypes%28%29
Sin embargo, no puede decir el nombre del argumento utilizado.
fuente
Es posible y Spring MVC 3 lo hace, pero no me tomé el tiempo para ver exactamente cómo.
Tomado de la documentación de primavera
fuente
Si bien no es posible (como lo han ilustrado otros), puede usar una anotación para transferir el nombre del parámetro y obtener eso a través de la reflexión.
No es la solución más limpia, pero hace el trabajo. Algunos servicios web realmente hacen esto para mantener los nombres de los parámetros (es decir, implementar WS con glassfish).
fuente
Ver java.beans.ConstructorProperties , es una anotación diseñada para hacer exactamente esto.
fuente
Entonces deberías poder hacer:
Pero probablemente obtendrá una lista como esta:
Creo que esto se solucionará en Groovy 2.5+
Entonces, actualmente, la respuesta es:
Ver también:
Para cada método, entonces algo como:
fuente
aMethod
. Quiero obtenerlo para todos los métodos en una clase.antlr
para obtener nombres de parámetros para esto?si usa el eclipse, vea la imagen siguiente para permitir que el compilador almacene la información sobre los parámetros del método
fuente
Como dijo @Bozho, es posible hacerlo si se incluye información de depuración durante la compilación. Hay una buena respuesta aquí ...
¿Cómo obtener los nombres de los parámetros de los constructores de un objeto (reflexión)? por @AdamPaynter
... usando la biblioteca ASM. He preparado un ejemplo que muestra cómo puedes lograr tu objetivo.
En primer lugar, comience con un pom.xml con estas dependencias.
Entonces, esta clase debe hacer lo que quieras. Solo invoca el método estático
getParameterNames()
.Aquí hay un ejemplo con una prueba unitaria.
Puedes encontrar el ejemplo completo en GitHub
Advertencias
static
métodos. Esto se debe a que en este caso el número de argumentos devueltos por ASM es diferente, pero es algo que se puede solucionar fácilmente.fuente
Los nombres de los parámetros solo son útiles para el compilador. Cuando el compilador genera un archivo de clase, los nombres de los parámetros no se incluyen: la lista de argumentos de un método solo consta del número y los tipos de sus argumentos. Por lo tanto, sería imposible recuperar el nombre del parámetro utilizando la reflexión (como está etiquetado en su pregunta); no existe en ningún lado.
Sin embargo, si el uso de la reflexión no es un requisito difícil, puede recuperar esta información directamente del código fuente (suponiendo que la tenga).
fuente
Parameter names are only useful to the compiler.
Incorrecto. Mire la biblioteca Retrofit. Utiliza interfaces dinámicas para crear solicitudes de API REST. Una de sus características es la capacidad de definir nombres de marcadores de posición en las rutas URL y reemplazar esos marcadores de posición con sus correspondientes nombres de parámetros.Para agregar mis 2 centavos; la información de parámetros está disponible en un archivo de clase "para depuración" cuando usa javac -g para compilar la fuente. Y está disponible para APT, pero necesitarás una anotación, así que no te servirá. (Alguien discutió algo similar hace 4-5 años aquí: http://forums.java.net/jive/thread.jspa?messageID=13467&tstart=0 )
En resumen, no puede obtenerlo a menos que trabaje directamente en los archivos de origen (similar a lo que hace APT en tiempo de compilación).
fuente