gpt4 book ai didi

java - org.apache.commons.beanutils.MethodUtils.invokeMethod 给出 java.lang.NullPointerException

转载 作者:行者123 更新时间:2023-11-30 07:31:58 24 4
gpt4 key购买 nike

我正在使用 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)

请帮忙

最佳答案

我希望简短的回答是您不能提供null 作为MethodUtils.invokeMethod 的第三个参数。我将解释为什么我怀疑是这样(如果属实,Javadocs 确实可以提及这一点)。

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() - 嘿 presto,如果你传入 null.


编辑:我假设您打算调用 invokeMethod(Object object, String methodName, Object arg) 方法 - 这确实会出现上述问题。在下面 Adam 的评论之后,您似乎很可能想调用 invokeMethod(Object object, String methodName, Object[] args) 方法,我相信在这种情况下它会起作用。

在这种情况下,您的问题是由编译器的类型推断和方法签名解析引起的。 null 文字可以表示任何非原始类型,因此它可以用于 ObjectObject[],同时不能代表他们中的任何一个。因此(以及我不是 100% 确定的规范的某些部分)编译器将您的 null 解释为 Object 并调用该方法,结果如上所述。

如果您的代码包含足够的信息来将 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]);

但使用标准 reflection 会相对简单,甚至可能更清晰:

void getName() {
try {
Class c = Class.forName("com.test1");
Object o = c.newInstance();
System.out.println(o);

// The next two lines replace the MethodUtils call
Method getValueMethod = c.getMethod("getValue");
String value = getValueMethod.invoke(o);

System.out.println("Results from getValue: " + value);
} catch (Exception e) {
e.printStackTrace();
}
}

关于java - org.apache.commons.beanutils.MethodUtils.invokeMethod 给出 java.lang.NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6924069/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com