Can I obtain method parameter name using Java reflection?
To summarize:
- getting parameter names is possible if debug information is included during compilation. See this answer for more details
- otherwise getting parameter names is not possible
- getting parameter type is possible, using
method.getParameterTypes()
For the sake of writing autocomplete functionality for an editor (as you stated in one of the comments) there are a few options:
- use
arg0
,arg1
,arg2
etc. - use
intParam
,stringParam
,objectTypeParam
, etc. - use a combination of the above - the former for non-primitive types, and the latter for primitive types.
- don't show argument names at all - just the types.
How to get parameter names with Java reflection
To get the method i of a class C you call C.class.getMethods()[i].toString()
.
EDIT: Obtaining parameter names is not possible using the reflection API.
But wen you compiled your class with debug information, it is possible to extract the information from bytecode. Spring does it using the ASM bytecode engineering library.
See this answer for further information.
How can I get the parameter name in java at run time
Starting from Java 8, you can use Reflection API to retrieve parameters names:
Method someMethod = Main.class.getDeclaredMethod("someMethod");
Parameter[] parameters = someMethod.getParameters();
for(Parameter parameter : parameters)
{
System.out.println(parameter.getName());
}
Also, see JavaDoc of Parameter#getName()
:
Returns the name of the parameter. If the parameter's name is present, then this method returns the name provided by the class file. Otherwise, this method synthesizes a name of the form argN, where N is the index of the parameter in the descriptor of the method which declares the parameter.
Getting the name of a method parameter
Parameter names are available if you have told the compiler to include them (compile with debug information). Spring has ParameterNameDiscoverer
which can help you obtain the names. The default implementation uses asm ClassReader
to do so.
With javac
you should include the -g
argument to include debug information. With Eclipse I think it is there by default; it can be configured using the preferences: Java -> Compiler and then enable "Store information about method parameters (usable via reflection)" (see also this answer).
Some frameworks use this. For example spring-mvc has @RequestParam
which defaults to the param name, if resolvable. It also supports explicit naming - @RequestParam("foo")
in case no debug information is provided.
Related Topics
How to Reference a Method in Javadoc
Java Naming Convention with Acronyms
Create Whole Path Automatically When Writing to a New File
Jtable Getselectedrow Does Not Return the Selected Row Index
Javamail with Gmail: 535-5.7.1 Username and Password Not Accepted
Sessiontimeout: Web.Xml VS Session.Maxinactiveinterval()
Are There Any Other Java Libraries for Bonjour/Zeroconf Apart from Jmdns
Java: What's the Difference Between Autoboxing and Casting
Data Structures That Can Map a Range of Keys to a Value
Lists with Wildcards Cause Generic Voodoo Error
Can a Class Have No Constructor
Differencebetween a Hashmap and a Treemap
Nosuchmethoderror on Startup in Java Jersey App
Why Are Java 8 Lambdas Invoked Using Invokedynamic
Find Files in a Folder Using Java
How to Convert Utf-8 to Us-Ascii in Java
How Do Java Method Annotations Work in Conjunction with Method Overriding