图像: 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?别的什么?请提前告知并提前致谢
答案 0 :(得分:0)
jar文件中(通常)没有目录。因此它将返回null。
如果您想获取该文件,您可以直接获取该资源:
InputStream fileInputStream = getClass().getResourceAsStream(File.pathSeparator+className+".class");