使用反射为返回值调用静态方法

时间:2012-09-11 10:44:59

标签: java reflection

  

可能重复:
  How do I invoke a private static method using reflection (Java)?

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

我怎样才能调用该方法,并获取类的返回值(实例)?我尝试使用的每个方法都要求我在它看来的参数中有一个类的实例。

例如,我尝试使用

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

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

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

我假设我得到的是因为它要求的对象是null。

感谢您的帮助。

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

5 个答案:

答案 0 :(得分:4)

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

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

或以下,因为它们是varargs方法。

Method method = classLoader.loadClass("testClass").getMethod("getInstance");
Object object = method.invoke(null);
// or works but is perhaps confusing.
Object object = method.invoke(null, null);

答案 1 :(得分: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之前没有varargs)。我正在使用Java运行时v1.6。

答案 2 :(得分:0)

这不是问题。 If the underlying method is static, then the specified obj argument is ignored. It may be null.

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

答案 3 :(得分:0)

我打赌问题出在你的getInstance方法中。你可以调试它或发布它。

答案 4 :(得分:-1)

使用getMethod("getInstance", null),你会说“获取一个名为'getInstance'且没有参数的方法”。

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

您应该删除最后一个null,然后输入:

Object object = method.invoke(null);