Java Classloader资源仅对特定实例可见

时间:2018-05-13 20:56:38

标签: java reflection classloader dynamic-class-loaders

我正在尝试将资源加载到我的运行时库中。但是在我当前的实现中,只有非常具体的URLClassLoader实例才能看到它。

URLClassLoader classLoader = new URLClassLoader(urls, ClassLoader.getSystemClassLoader());
classLoader.addFile(super.getResource(urlPath));

classLoader.classLoader.getResourceAsStream(path) //works

URLClassLoader secondClassLoader = new URLClassLoader(urls, ClassLoader.getSystemClassLoader());
secondClassLoader.classLoader.getResourceAsStream(path) // doesn't work 

另一个问题是,我不知道库实际上使用哪个ClassLoader作为父级。最好的解决方案是每个类加载器都可以访问资源。

如何确保所有类加载器都可以访问动态加载的资源?

1 个答案:

答案 0 :(得分:0)

看起来,您有两个选择(尽管两个解决方案都遵循相似的原理)。

常规解决方案(无自定义类加载器):从应用程序类加载器加载资源。这可以通过确保资源位置包含在应用程序类路径中来实现(将资源保存为应用程序jar文件的一部分是实现此目的的一种方法)。

有点复杂(使用自定义类加载器):在这种情况下,必须确保将资源路径添加到所有自定义类加载器的类路径中。一种更简便的方法是定义一个超级自定义类加载器,并从该超级加载器继承所有其他类加载器。并将资源加载到超级类加载器的类路径中。

现在,我希望您了解基本原理:如果给定资源在其父级的类路径(递归)或自己的类路径中可见,则类加载器将能够加载该资源。 < / p>