我正在尝试从类文件动态加载。下面的代码无法调用类中的方法。
public static void main(String[] args) {
try {
File loadPath = new File("C:/loadtest/");
URL url = loadPath.toURI().toURL();
URL[] urls = new URL[]{url};
ClassLoader cl = new URLClassLoader(urls);
Class cls = cl.loadClass("TesterClass");
System.out.println("Classname: " + cls.getName());
Method[] m = cls.getMethods();
for (Method m1 : m){
try {
System.out.println("Method: " + m1.getName());
if (m1.getName().equals("getName")) {
Object o = m1.invoke(null, null);
System.out.println("o is : " + o);
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
} catch (MalformedURLException | ClassNotFoundException e) {
}
}
我试图调用的目标Java类:
public class TesterClass {
public hamster() {
}
public void getName() {
System.out.println("TEST SUCCEED !!!");
}
}
我得到的是:
Classname: TesterClass
Method: getName
Method: getClass
Method: hashCode
Method: equals
Aug 07, 2013 4:06:44 PM Tester main
Method: toString
Method: notify
Method: notifyAll
Method: wait
SEVERE: null
Method: wait
Method: wait
java.lang.NullPointerException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at Tester.main(Tester.java:40)
只是注意,行号40是不准确的,因为我删除了注释和不必要的部分来压缩上述代码。
为什么会出现NullPointerException?我试图修改它只调用“getName()”方法,它也崩溃了。我该如何解决这个问题?
答案 0 :(得分:7)
您正在获取NPE,因为您已将null
传递到invoke
:
Object o = m1.invoke(null, null);
...用于实例方法。您必须将类的实例传递给调用实例方法。
创建一个实例,可能就在获取类之后:
Class cls = cl.loadClass("TesterClass");
Object inst = cls.newInstance(); // <== This is the new line
...然后在调用方法时,传入该实例。我也认为你不需要支持varargs的Java版本的第二个null
(所以,任何模糊的近期),所以:
Object o = m1.invoke(inst);
// Instance here ----^
或旧版本:
Object o = m1.invoke(inst, null);
// Instance here ----^