java怎么获取方法参数名

Python011

java怎么获取方法参数名,第1张

在java中,可以通过反射获取到类、字段、方法签名等相关的信息,像方法名、返回值类型、参数类型、泛型类型参数等,但是不能够获取方法的参数名。在实际开发场景中,有时需要根据方法的参数名做一些操作,比如像spring-mvc中,@RequestParam、@PathVariable注解,如果不指定相应的value属性,默认就是使用方法的参数名做为HTTP请求的参数名,它是怎么做到的呢?

在这样情况下,有两种方法获取方法来解决这种需求,第一种方法是使用注解,在注解中指定对应应的参数名称,在需要使用参数名称时,获取注解中相应的值即可。第二种方法是从字节码中获取方法的参数名,但是这有一个限制,只有在编译时使用了-g或-g:vars参数生成了调试信息,class文件中才会生成方法参数名信息(在本地变量表LocalVariableTable中),而使用-g:none方式编译的class文件中是没有方法参数名信息的。所以要想完全不依赖class文件的编译模式,就不能使用这种方式。

package test

import 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))

}

}