簡體   English   中英

java jar getClass().getClassLoader().getResourceAsStream 返回空指針異常

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM