我已经制作了一个自定义类加载器,它从我的网站下载一个jar,然后运行它。 问题是:我(下载)的jar需要一些资源,如png图像等......
如果我在命令提示符下直接运行我的(下载的)jar,它可以工作。资源加载如下:
getClass().getResource("/images/logo.png")
现在,如果我使用自定义类加载器运行它,使用:
Class<?> c = classLoader.loadClass("MainClass");
c.getMethod("main", new Class[] { java.lang.String[].class}).invoke(null, new Object[]{new String[] {"arg1_goes_here"}});
我得到一个null异常,因为它无法加载资源。
当我将jar文件加载到内存中时,我会这样做:
String name = entry.getName();
if(name.endsWith(".class")) {
name = name.substring(0, name.length() - 6).replace('/', '.');
classbytes = getResourceData(input);
classes.put(name, classbytes);
} else {
classbytes = getResourceData(input);
if (name.charAt(0) != '/') {
name = "/" + name;
}
resources.put(name, classbytes);
}
我正在使用以下方式加载我的课程:
defineClass(classToLoad, buffer, 0, buffer.length, null);
其中buffer
是包含代码的字节数组。
所以我的问题如下:Java中是否有一种defineResource()?
感谢。
答案 0 :(得分:2)
问题解决了,
我已经编写了自己的方法public InputStream getResourceAsStream(String name)
。
以下是代码:
public InputStream getResourceAsStream(String name)
{
byte[] buffer = resources.get(name);
return new ByteArrayInputStream(buffer);
}
resources
是包含我的资源数据的地图。
然后,在我的代码中,我可以使用输入流来获取我的资源。简单安全。