2

可能重复:
如何使用反射(Java)调用私有静态方法?

所以有一个名为“getInstance”的方法,它只返回某个类的实例。这是一个没有参数的静态方法。

我如何调用该方法并获取类的返回值(实例)?我尝试使用的每种方法都要求我在看起来的参数中有一个类的实例。

例如,我尝试使用

Method method = classLoader.loadClass("testClass").getMethod("getInstance", null);
            Object object = method.invoke(null, null);

但我总是在这一行得到一个空指针异常,

Object object = method.invoke(null, null);

我假设我得到了它,因为它要求的对象是空的。

谢谢你的帮助。

编辑:方法不为空。我正在做一个System.out.println(method == null);它打印出来的错误。

4

5 回答 5

4

您不希望null作为参数或参数列表。相反,你可以做

Method method = classLoader.loadClass("testClass").getMethod("getInstance", new Class[0]);
Object object = method.invoke(null, new Object[0]);

或以下,因为它们是可变参数方法。

Method method = classLoader.loadClass("testClass").getMethod("getInstance");
Object object = method.invoke(null);
// or works but is perhaps confusing.
Object object = method.invoke(null, null);
于 2012-09-11T10:56:34.967 回答
1

对我来说,以下两段代码都适用于静态方法并打印出返回值。

Method method = myClass.getMethod("getInstance", null);
Object object = method.invoke(null);
System.out.println("returned value: "+object);

Method method = myClass.getMethod("getInstance", null);
Object object = method.invoke(null,null);
System.out.println("returned value: "+object);

我认为这取决于您使用的 Java 版本(1.5 之前没有可变参数)。我正在使用 Java 运行时 v1.6。

于 2012-09-11T11:04:42.530 回答
0

那不是问题。 如果底层方法是静态的,则忽略指定的 obj 参数。它可能为空。

因此,方法本身似乎必须为空。

于 2012-09-11T10:48:45.360 回答
0

我敢打赌,问题出在你的getInstance方法上。你能调试它或发布它。

于 2012-09-11T10:56:36.033 回答
-1

getMethod("getInstance", null)您说的是“获取名称为'getInstance'且没有参数的方法”。

当您键入时,method.invoke(null, null)您说的是“在对象'null'上调用此方法,并将'null'作为第一个参数传递”。

您应该删除最后一个null,只需键入:

Object object = method.invoke(null);
于 2012-09-11T10:58:19.193 回答