org.apache.commons.beanutils.MethodUtils.invokeMethod提供java.lang.NullPointerException
我使用的是org.apache.commons.beanutils.MethodUtils.invokeMethod提供java.lang.NullPointerException,java,apache-commons,Java,Apache Commons,我使用的是org.apache.commons.beanutils.MethodUtils.invokeMethod。它给了我空指针异常 下面是我的第一节课 package com; import org.apache.commons.beanutils.MethodUtils; public class test { public static void main(String[] args) { test t = new test(); t.ge
org.apache.commons.beanutils.MethodUtils.invokeMethod
。它给了我空指针异常
下面是我的第一节课
package com;
import org.apache.commons.beanutils.MethodUtils;
public class test {
public static void main(String[] args) {
test t = new test();
t.getName();
}
void getName() {
try {
Class c = Class.forName("com.test1");
Object o = c.newInstance();
System.out.println(o);
String value = (String) MethodUtils.invokeMethod(o, "getValue",null);
System.out.println("Results from getValue: " + value);
} catch (Exception e) {
e.printStackTrace();
}
}
下面是我的第二节课
package com;
public class test1 {
public String getValue() {
return "value";
}
}
当我尝试运行测试时,它会给我以下错误
com.test1@1add2dd
java.lang.NullPointerException
at org.apache.commons.beanutils.MethodUtils.invokeMethod(MethodUtils.java:167)
at com.test.getName(test.java:18)
at com.test.main(test.java:9)
通用域名格式。test1@1add2dd
java.lang.NullPointerException
位于org.apache.commons.beanutils.MethodUtils.invokeMethod(MethodUtils.java:167)
位于com.test.getName(test.java:18)
位于com.test.main(test.java:9)
请帮助我希望简短的回答是您不能提供
null
作为MethodUtils.invokeMethod
的第三个参数。我将解释为什么我怀疑这是真的(如果是真的,我真的可以提及这一点)
MethodUtils几乎可以肯定只是标准Java反射库的一层。它采用名称、类或参数形式的方法签名来查找方法。这是必需的,因为可以重写方法:
public void foo(String s) {
System.out.println("Got a string: " + s);
}
public void foo(int i) {
System.out.println("Got an int: " + i);
}
因此,invokeMethod
调用将几个步骤捆绑在一起,但它仍然需要能够查找正确的java.lang.reflect.Method
对象。为了做到这一点,它需要知道参数的类型(看起来您调用的版本只适用于一元方法)。因此,我能看到它能够做到这一点的唯一方法是对传入的对象调用arg.getClass()
,如果传入null
,则调用NPE
编辑:我的工作假设您打算调用
invokeMethod(Object-Object,String-methodName,Object-arg)
方法,这确实会出现上述问题。在下面Adam的评论之后,似乎很有可能您想要调用invokeMethod(Object-Object,String-methodName,Object[]args)
方法,我相信在这种情况下该方法会起作用
在这种情况下,问题是由编译器的类型推断和方法签名解析引起的。null
文本可以表示任何非原语类型,因此它可以用于Object
或Object[]
,但同时不表示这两种类型。由于这一点(以及规范的某些部分,我不是100%确定),编译器将null
解释为对象
,并调用该方法,其结果如上所述
如果您的代码包含足够的信息以将null标识为null数组,则可以通过强制转换:
String value = (String) MethodUtils.invokeMethod(o, "getValue", (Object[])null);
或通过指定给强类型变量:
Object[] args = null;
String value = (String) MethodUtils.invokeMethod(o, "getValue", args);
除了上述类型推断修复之外,您还可以通过显式提供参数的类信息,使用
MethodUtils
解决此问题:
MethodUtils.invokeMethod(o, "getValue", new Object[0], new Class[0]);
但使用标准,这将相对简单,甚至更清晰:
为什么不使用
String value = (String) MethodUtils.invokeExactMethod(o, "getValue",null);
is对空第三个参数也不例外您使用的是哪个版本的beanutils?一切看起来都很好。你清理并重新编译了吗?为什么要使用反射创建一个新的com.test1?我没有任何反编译器,从eclipse类编辑器中发现beanutils是1.1版本,但不确定它是否精确。我在应用程序中遇到了空指针异常,因此编写了一个类似的独立程序。@Sridevi Laks:我认为您没有实际运行1.1版,因为该特定版本没有
MethodUtils
类。也许你应该试着下载最新版本并在你的项目中使用它,这样你就知道你在处理什么版本了。:“args
-使用这些参数-将null视为空数组”对不起,我刚刚意识到我可能选择了错误的、重载的invokeMethod
方法。Java编译器在判断null
是否对应于对象
参数和对象[]
参数时选择了什么?+1让我对微笑,嘿,如果你传入null
@Adam,那就是NPE,这是一个非常好的观点。从我对的阅读中,我希望Object[]
方法被认为比Object
更具体,因此被称为。但是很可能,null
的类型推断已经发生,并确定它是一个对象
,在这种情况下,另一个方法正好匹配…@Sridevi:也许您使用的库的版本与我看到的不同。在v1.8.3中,应该将null
数组转换为空数组,尽管可以说,正如上面所说的那样,自己传入空数组更为清晰。
String value = (String) MethodUtils.invokeExactMethod(o, "getValue",null);