Java 使用反射获取方法中的参数名称

Java 使用反射获取方法中的参数名称,java,reflection,Java,Reflection,我正在编写一个小框架,它将在jvm中加载类并调用其方法。方法参数是基于形式参数名生成的。我试图通过使用反射来获得它的名称 import java.lang.reflect.*; public class Test { public static void main(String[] args) { Method[] methods = Test.class.getMethods(); for(Method method : methods) {

我正在编写一个小框架,它将在jvm中加载类并调用其方法。方法参数是基于形式参数名生成的。我试图通过使用反射来获得它的名称

import java.lang.reflect.*;

public class Test {

    public static void main(String[] args) {

        Method[] methods = Test.class.getMethods();

        for(Method method : methods) {
            Type[] params = method.getGenericParameterTypes();
            for(Type param : params) {
                System.out.println(param);
            }
        }

    }

}
我知道这在jdk8中是可能的


如何在jdk6或JDK7中获得此功能?。因为,我们的大多数服务器都使用jdk6运行

尽管它有点长,但很容易理解,而且您可以获得方法名称的参数,只要尝试一下就可以了

    import java.lang.reflect.*;
import java.util.function.*;
import static java.lang.System.out;

public class MethodParameterSpy {

    private static final String  fmt = "%24s: %s%n";

    // for the morbidly curious
    <E extends RuntimeException> void genericThrow() throws E {}

    public static void printClassConstructors(Class c) {
        Constructor[] allConstructors = c.getConstructors();
        out.format(fmt, "Number of constructors", allConstructors.length);
        for (Constructor currentConstructor : allConstructors) {
            printConstructor(currentConstructor);
        }  
        Constructor[] allDeclConst = c.getDeclaredConstructors();
        out.format(fmt, "Number of declared constructors",
            allDeclConst.length);
        for (Constructor currentDeclConst : allDeclConst) {
            printConstructor(currentDeclConst);
        }          
    }

    public static void printClassMethods(Class c) {
       Method[] allMethods = c.getDeclaredMethods();
        out.format(fmt, "Number of methods", allMethods.length);
        for (Method m : allMethods) {
            printMethod(m);
        }        
    }

    public static void printConstructor(Constructor c) {
        out.format("%s%n", c.toGenericString());
        Parameter[] params = c.getParameters();
        out.format(fmt, "Number of parameters", params.length);
        for (int i = 0; i < params.length; i++) {
            printParameter(params[i]);
        }
    }

    public static void printMethod(Method m) {
        out.format("%s%n", m.toGenericString());
        out.format(fmt, "Return type", m.getReturnType());
        out.format(fmt, "Generic return type", m.getGenericReturnType());

        Parameter[] params = m.getParameters();
        for (int i = 0; i < params.length; i++) {
            printParameter(params[i]);
        }
    }

    public static void printParameter(Parameter p) {
        out.format(fmt, "Parameter class", p.getType());
        out.format(fmt, "Parameter name", p.getName());
        out.format(fmt, "Modifiers", p.getModifiers());
        out.format(fmt, "Is implicit?", p.isImplicit());
        out.format(fmt, "Is name present?", p.isNamePresent());
        out.format(fmt, "Is synthetic?", p.isSynthetic());
    }

    public static void main(String... args) {        

        try {
            printClassConstructors(Class.forName(args[0]));
            printClassMethods(Class.forName(args[0]));
        } catch (ClassNotFoundException x) {
            x.printStackTrace();
        }
    }
}
import java.lang.reflect.*;
导入java.util.function.*;
导入静态java.lang.System.out;
公共类MethodParameterSpy{
私有静态最终字符串fmt=“%24s:%s%n”;
//为了病态的好奇
void genericThrow()抛出E{}
公共静态类构造函数(c类){
构造函数[]allConstructors=c.getConstructors();
out.format(fmt,“构造函数数量”,allConstructors.length);
对于(构造函数currentConstructor:allConstructors){
printConstructor(currentConstructor);
}  
构造函数[]allDeclConst=c.getDeclaredConstructors();
out.format(fmt,“声明的构造函数数量”,
所有十进制长度);
for(构造函数currentDeclConst:allDeclConst){
打印构造函数(currentDeclConst);
}          
}
公共静态void printClassMethods(c类){
方法[]allMethods=c.getDeclaredMethods();
格式(fmt,“方法数”,所有方法长度);
对于(方法m:所有方法){
印刷法(m);
}        
}
公共静态构造函数(构造函数c){
out.format(“%s%n”,c.toGenericString());
参数[]params=c.getParameters();
输出格式(fmt,“参数数量”,参数长度);
对于(int i=0;i
使用。早在Java-8之前,方法参数名不可用(合成或烘焙到字节码中)时,它就是专门为此目的设计的通过反射。

您可以使用jdk 7来实现这一点。当您使用Java运行代码时会发生什么情况?我认为Java<8不可能做到这一点,即使使用8,也只有在您使用一些特殊的编译器参数时才可能,AFAIK。@imrichardcole,我必须用jdk8更新和测试我们的服务器。是的,它将获得我们在Source中定义的原始参数,但是getParameters()方法与OP提到的方法相同,它仅在sind Java SE 8中可用。。。。