0

可能重复:
使用自定义类加载器加载资源包

我制作了一个自定义类加载器,它从我的网站下载一个 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"}});

我得到一个空异常,因为它无法加载资源。

当我将 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()吗?

谢谢。

4

1 回答 1

2

问题解决了,

我写了我自己的方法public InputStream getResourceAsStream(String name)

这是代码:

public InputStream getResourceAsStream(String name)
{
    byte[] buffer = resources.get(name);
    return new ByteArrayInputStream(buffer);
}

resources是一个包含我的资源数据的地图。

然后,在我的代码中,我可以使用输入流来取回我的资源。简单安全。

于 2012-06-26T21:18:02.203 回答