[英]getClass().getClassLoader().getResourceAsStream is throwing a NullPointerException
[英]java jar getClass().getClassLoader().getResourceAsStream return nullpointerexception
圖片:這是我的項目目錄
在 MainRun 類中,我有以下代碼:
package bin;
public class MainRun{
public static void main(String[] args){
compileCode("Square.java");
int length = 0;
MCAMClassLoader classLoader = new MCAMClassLoader();
Class<?> c= classLoader.findClass(bin.Square);
try{
Shape myClassObject = (Shape)c.newInstance();
Method method = c.getMethod(getLength);
Object result = method.invoke(myClassObject);
length = (int)result;
}
catch(Exception e){
e.printStackTrace();
}
System.out.println(length);
}
public void compileCode(String _filename){
String[] args = new String[] {"-d", "C:\Users\Tan\Downloads\MCAM", "C:\Users\Tan\Downloads\MCAM\src\"+_filename};
com.sun.tools.javac.Main javac = new com.sun.tools.javac.Main();
javac.compile(args);
}
}
在我的自定義 ClassLoader 中,我有以下代碼:
package bin;
public class MCAMClassLoader extends ClassLoader{
@Override
public Class<?> findClass(String name)
{
byte[] bt = loadClassData(name);
return defineClass(name, bt, 0, bt.length);
}
private byte[] loadClassData(String className) {
InputStream is = this.getClass().getClassLoader().getResourceAsStream(className.replace(".", "/")+".class"); //it will end up with bin/Square.class
ByteArrayOutputStream byteSt = new ByteArrayOutputStream();
int len =0;
try
{
while((len=is.read())!=-1)
{
byteSt.write(len);
}
} catch (IOException e) {
e.printStackTrace();
}
return byteSt.toByteArray();
}
}
我在運行時添加並編譯了我的 Square 類。 Square.class 將位於 bin 文件夾中。
package bin;
public class Square extends Shape{
public Square(){
length = 8;
}
public int getLength(){
return length;
}
}
這些代碼在控制台上由 .bat 執行時工作得很好。 只有當我將這些文件構建成一個 jar 文件並運行它時,我才會在控制台上收到錯誤:NullPointerException 落在“while((len=is.read()))!=-1)”行上。
注意:在我的 MANIFEST.MF 中
Manifest-Version: 1.0
Main-Class: bin.MainRun
Class-Path: .\lib\xmlbeans-2.6.0.jar .\lib\tools.jar
為什么? 我是否錯誤地使用了 ClassLoader? 還有什么? 請提前告知並致謝
jar 文件中(通常)沒有目錄。 因此它將返回空值。
如果要獲取文件,可以直接獲取該資源:
InputStream fileInputStream = getClass().getResourceAsStream(File.pathSeparator+className+".class");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.