java jar getClass()。getClassLoader()。getResourceAsStream return nullpointerexception

时间:2015-11-09 18:10:44

标签: java jar classpath classloader inputstream

图像: This is my Project directory

在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落在行上&#34; while((len = is.read())!= - 1)& #34;

注意:在我的MANIFEST.MF

Manifest-Version: 1.0
Main-Class: bin.MainRun
Class-Path: .\lib\xmlbeans-2.6.0.jar .\lib\tools.jar

为什么?我是否错误地使用了ClassLoader?别的什么?请提前告知并提前致谢

1 个答案:

答案 0 :(得分:0)

jar文件中(通常)没有目录。因此它将返回null。

如果您想获取该文件,您可以直接获取该资源:

InputStream fileInputStream = getClass().getResourceAsStream(File.pathSeparator+className+".class");