2011-09-05 111 views
1

我想从模块依赖项(类路径中的外部jar文件)加载类文件。当我尝试的getResourceAsStream我得到空指针异常:在myclasspath从类路径加载类文件

ClassParser parser = new ClassParser(this.getClass().getResourceAsStream("org/apache/tools/ant/taskdefs/optional/net/FTP.class"), "FTP.class"); 

Exception in thread "main" java.lang.NullPointerException 
    at com.sun.org.apache.bcel.internal.classfile.ClassParser.<init>(ClassParser.java:101) 
    at ParaNamesTest.printUtilsParNames(ParaNamesTest.java:52) 
    at ParaNamesTest.main(ParaNamesTest.java:45) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120) 

的ant.jar但还是java的找不到怎么办?

回答

2

你问你的类的类加载器(this.getClass())从一个不同的JAR资源,这是行不通的。

尝试用... (FTP.class.getResourceAsStream(...代替... (this.getClass().getResourceAsStream(... whith FTP被导入为org.apache.tools.ant.taskdefs.optional.net.FTP

如果你只有在运行时类的名称,可以动态使用完全合格的类名和Class.forName得到Class对象:

String className = "org.apache.tools.ant.taskdefs.optional.net.FTP"; 
... (Class.forName(className).getResourceAsStream(... 
+0

有另一种方式作为类名称会在运行时 –

+0

是给予加载类,使用'的Class.forName()'。我更新了我的答案,以包含这种方式的示例代码。 –

0

如果你为这个资源得到null,则意味着这个类可以在班级路径中找不到。我会尝试@菲利普的建议(不是因为它更有可能发挥作用),而是因为如果这个班级在你的班级路径上,它会变得很明显。

0

使用Class.forName("java.lang.String")例如获得String.class

相关问题