在这样情况下,有两种方法获取方法来解决这种需求,第一种方法是使用注解,在注解中指定对应应的参数名称,在需要使用参数名称时,获取注解中相应的值即可。第二种方法是从字节码中获取方法的参数名,但是这有一个限制,只有在编译时使用了-g或-g:vars参数生成了调试信息,class文件中才会生成方法参数名信息(在本地变量表LocalVariableTable中),而使用-g:none方式编译的class文件中是没有方法参数名信息的。所以要想完全不依赖class文件的编译模式,就不能使用这种方式。
package testimport java.lang.reflect.Method
public class TTT {
public static void main(String[] args) {
Class c = Test.class
Method[] methods =c.getDeclaredMethods()
for (Method method : methods) {
System.out.print("方法的返回值"+method.getReturnType().getName())
System.out.print(" 方法名:"+method.getName()+"(")
Class[] paraTypes = method.getParameterTypes()
for (Class class1 : paraTypes) {
System.out.print("参数类型:"+class1.getSimpleName()+",")
}
System.out.println(")")
}
}
}
class Test
{
public void say(String word)
{
System.out.println(word)
}
public void say(String word,int n)
{
for(int i=0i<ni++){
System.out.println(word)
}
}
}
===============
方法的返回值void 方法名:say(参数类型:String,)
方法的返回值void 方法名:say(参数类型:String,参数类型:int,)
package com.mikan
import java.lang.annotation.*
/**
* @author Mikan
* @date 2015-08-04 23:39
*/
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Param {
String value()
}
获取注解中的参数名的工具类:
package com.mikan
import java.lang.annotation.Annotation
import java.lang.reflect.Method
/**
* @author Mikan
* @date 2015-08-05 00:26
*/
public class ParameterNameUtils {
/**
* 获取指定方法的参数名
*
* @param method 要获取参数名的方法
* @return 按参数顺序排列的参数名列表
*/
public static String[] getMethodParameterNamesByAnnotation(Method method) {
Annotation[][] parameterAnnotations = method.getParameterAnnotations()
if (parameterAnnotations == null || parameterAnnotations.length == 0) {
return null
}
String[] parameterNames = new String[parameterAnnotations.length]
int i = 0
for (Annotation[] parameterAnnotation : parameterAnnotations) {
for (Annotation annotation : parameterAnnotation) {
if (annotation instanceof Param) {
Param param = (Param) annotation
parameterNames[i++] = param.value()
}
}
}
return parameterNames
}
}
测试类:
package com.mikan
import java.lang.reflect.Method
import java.util.Arrays
/**
* @author Mikan
* @date 2015-08-04 23:40
*/
public class ParameterNameTest {
public void method1(@Param("parameter1") String param1, @Param("parameter2") String param2) {
System.out.println(param1 + param2)
}
public static void main(String[] args) throws Exception {
Class<ParameterNameTest> clazz = ParameterNameTest.class
Method method = clazz.getDeclaredMethod("method1", String.class, String.class)
String[] parameterNames = ParameterNameUtils.getMethodParameterNamesByAnnotation(method)
System.out.println(Arrays.toString(parameterNames))
}
}