我怎么能从它的名字知道方法返回类型?

时间:2013-05-30 10:58:08

标签: java reflection methods return return-type

我想知道方法返回类型只是它的名字,我正在使用该代码,但它对我不起作用(它总是返回null):

public Object getType(String key) throws Exception {

        Object returnType = null;
        String name = key;
        Method[] methods = name.getClass().getMethods();
        for(int i =0; i < methods.length ; i++){
            if(key.equals(methods[i])){
                returnType = methods[i].getReturnType();
            }
        }
        return returnType;
    }

3 个答案:

答案 0 :(得分:3)

而不是:

if(key.equals(methods[i])){
你应该

if(key.equals(methods[i].getName())){

您的代码也可以进行一些小的改进,您不需要returnType局部变量,并且当您找到所需的方法时,不需要遍历所有剩余的方法,所以代码可能是:

 public Object getType(String key) throws Exception {
    String name = key;
    Method[] methods = name.getClass().getMethods();
    for(int i =0; i < methods.length ; i++){
        if(key.equals(methods[i])){
            return methods[i].getReturnType();
        }
    }
    return null;
}

答案 1 :(得分:1)

你的尝试有很多不妥之处;你似乎在任意选择调用方法,直观地判断它们的作用。请参考以前从未使用过的所有JDK方法的Javadoc。

  1. name.getClass()返回反映在java.lang.String上的对象。您需要Class.forName(name);

  2. 如果您不知道该方法应该成为哪个类,那么您的整个方案将无法工作。如果你的字符串包含类名和方法名,那么你需要解析它以分开这两个名字;

  3. klass.getMethods()只会为您提供公开会员方法。这可能是也可能不是你所追求的。还有getDeclaredMethods(),但是这个没有给你继承的方法。

答案 2 :(得分:1)

你错过了两件事。代替

key.equals(methods[i])

应该是:

key.equals(methods[i].getName())

在我看来,第二件事是正在调查的一个类(你的代码在java.lang.String中寻找方法)。因此该方法应如下所示:

public Object getType(String methodName, Class<?> clazz) throws Exception {
    String name = methodName;
    Method[] methods = clazz.getMethods();
    for (int i = 0; i < methods.length; i++) {
        if (name.equals(methods[i].getName())) {
            return methods[i].getReturnType();
        }
    }
    return null;
}

并称之为:

type = getType("someMethodName",YourClass.class);

type = getType("someMethodName",YourObject.getClass());