如何实现java.lang.Classloader getResources()?

时间:2012-03-28 17:08:02

标签: java classloader

我搜索了很多,但没有找到任何满意的答案。如果这对你来说太明显了,请原谅我。

我编写了一个正在获取getResources()回调的类加载器,该资源是一个文件夹名称。在类加载器中,我有从中获取资源的根路径。

现在getResources()要求我返回'Enumeration'的网址。

我不知道如何创建Enumeration,如何在hasMoreElements()内实现其nextElement()getResources()。我无法看到两者之间的联系。

我可以从根目录中简单地搜索子路径并将资源的绝对路径作为URL返回吗?为什么需要创建这个复杂的Enumeration

谢谢, VIMAL

2 个答案:

答案 0 :(得分:2)

Enumeration是一个非常古老的Java类,已被更新的Collections库取代。您可以通过创建Collection(单个元素)然后在其上调用Collections.enumeration()来获取一个:

Enumeration<String> enumInstance = Collections.enumeration(Arrays.asList("Bla"));

答案 1 :(得分:2)

通常,您必须在自己的类加载器中覆盖的两个最重要的方法是public Class findClass(String name)public InputStream getResourceAsStream(String name)。在大多数情况下,可以将其他人委托给父类加载器。这意味着您必须有一个非常特殊的目的来覆盖getResources()。它是什么?

在任何一种情况下,您都可以轻松添加记录器,将方法委托给父类加载器,并查看父类加载器请求和返回的内容。

<强>更新

如果根据您的评论,您希望从运行时生成的路径中加载类/资源,则应执行以下操作: 当path被传递给类加载器(比如/home/user1/)时,它应该递归地列出它在两个不同集合中存储文件的内容 - 类文件和其他文件。第一个集合将用于类加载,第二个集合将用于资源。

对于资源集合中的每个文件,您可以根据http://docs.oracle.com/javase/6/docs/api/java/lang/ClassLoader.html#getResource%28java.lang.String%29定义它的资源路径,并从文件中获取URL:URL url = file.toURI().toURL(); 这些路径和网址在地图中存储为key-&gt;值,并在相关方法中使用。

至于资源路径,我认为它应该与路径有些相关,路径传递给您的类加载器:/home/user1/img/logo.gif =&gt; /img/logo.gif