2011-09-05 128 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