1

有没有办法在不指定参数的情况下使用反射的方法?

我试过这个:

method = className.class.getMethod("nameOfTheMethod");

wherenameOfTheMethod是一个有 5 个参数的函数。

但它认为这nameOfTheMethod是一个没有参数的函数,并给了我java.lang.NoSuchMethodException.

4

4 回答 4

2

你可以得到所有的方法

由此 Class 对象表示的类或接口声明。

Method[] methods = ClassName.class.getDeclaredMethods();

遍历它们并找到你的。如果您的方法重载,这是不安全的,因为您仍然需要检查参数。

于 2013-08-22T13:56:11.220 回答
1

你不能那样做,getMethod需要参数的数量。

您可以使用getMethodsgetDeclaredMethods,这取决于您要查找的内容,并将它们中的任何一个与您想要的名称相匹配。

您可以获得超过 1 个与名称匹配但具有不同参数的名称。

getMethods将要

返回一个包含 Method 对象的数组,该对象反映此 Class 对象表示的类或接口的所有公共成员方法,包括由类或接口声明的那些以及从超类和超接口继承的那些

虽然getDeclaredMethods

返回一个 Method 对象数组,反映由此 Class 对象表示的类或接口声明的所有方法。这包括公共、受保护、默认(包)访问和私有方法,但不包括继承的方法。

于 2013-08-22T13:57:50.467 回答
1

您可以通过使用getDeclaredMethods()和迭代返回的数组来实现这一点。

    Method[] methods = className.class.getDeclaredMethods();
    for (Method m : methods) {
        if (m.getName().equals("nameOfTheMethod")) {
            // found
            break;
        }
    }

这种方式有一个缺点,它只对未重载的方法可靠。但是,您可以轻松地更进一步,因此找到具有指定名称的所有方法的数组或集合。

于 2013-08-22T13:59:32.780 回答
0

您需要指定参数类型

尝试

Class[] cArg = new Class[5];
cArg[0] = Long.class;
cArg[1] = Long.class;
cArg[2] = Long.class;
cArg[3] = Long.class;
cArg[4] = Long.class;
Method lMethod = c.getMethod("nameOfMethod", cArg);

将 long 分别替换为您的参数的任何类型。

于 2013-08-22T14:01:09.527 回答