- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 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
文字可以表示任何非原始类型,因此它可以用于 Object
或 Object[]
,同时不能代表他们中的任何一个。因此(以及我不是 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/
是否可以使用 MethodUtils 调用私有(private)静态方法? LocalDateTime d = (LocalDateTime)MethodUtils.invokeStaticMeth
我正在使用 org.apache.commons.beanutils.MethodUtils.invokeMethod。它给了我空指针异常。 下面是我的第一个类 package com; import
我正在尝试配置 Spring Boot 1.4.3 和 Apachetiles 3。使用下面的配置我得到: org.springframework.web.util.NestedServletExce
我是一名优秀的程序员,十分优秀!