2012-03-28 17 views
4

Ich habe ziemlich viel gesucht, fand aber keine befriedigende Antwort. Bitte vergib mir, wenn dir das zu offensichtlich ist.wie zu implementieren java.lang.Classloader getResources()?

Ich habe einen Klassenlader geschrieben, der einen Aufruf für getResources() erhält, und die Ressource ist ein Ordnername. Im Classloader habe ich den Root-Pfad, von dem die Ressource gefragt wird.

jetzt die getResources() erfordert, dass ich eine 'Enumeration' von URL zurückgeben.

ich keine Ahnung, wie immer ein Enumeration zu schaffen, wie seine hasMoreElements() und nextElement() innerhalb getResources() zu implementieren. Ich kann die Verbindung zwischen den beiden nicht sehen.

Kann ich nicht einfach nach dem Unterpfad vom Stamm suchen und den absoluten Pfad der Ressource als URL zurückgeben? Warum müssen Sie diese komplizierte Enumeration erstellen?

Danke, Vimal

Antwort

2

Regel die beiden wichtigsten Methoden, dass Sie in Ihrem eigenen Classloader außer Kraft zu setzen haben, sind public Class findClass(String name) und public InputStream getResourceAsStream(String name) . Andere können in den meisten Fällen an den übergeordneten Klassenlader delegiert werden. Das bedeutet, dass Sie beim Überschreiben einen ganz besonderen Zweck haben müssen: getResources(). Was ist es?

In beiden Fällen können Sie problemlos einen Logger hinzufügen, die Methode an den übergeordneten Klassenlader delegieren und sehen, was vom übergeordneten Klassenlader angefordert und zurückgegeben wird.

UPDATE

Wenn, wie pro Ihren Kommentar, Sie wollen Belastungsklassen/Ressourcen von einem Weg, der zur Laufzeit generiert wird, sollten Sie Folgendes tun: wenn Pfad zu Classloader übergeben wird (sagen /home/user1/), sollte es rekursiv seinen Inhalt auflisten, der Dateien in zwei verschiedenen Sammlungen speichert - Klassendateien und andere Dateien. Die erste Sammlung wird zum Classloading verwendet, die zweite - für Ressourcen.

Für jede Datei in Ressourcensammlung definieren Sie es Ressourcenpfad ist nach http://docs.oracle.com/javase/6/docs/api/java/lang/ClassLoader.html#getResource%28java.lang.String%29 und die URL aus der Datei erhalten: URL url = file.toURI().toURL(); Diesen Pfad und URL Sie speichern als Key-> Wert irgendwo in einer Karte und verwenden Sie es in Verfahren in Frage.

Wie für Ressourcenpfad, ich glaube, es auf den Pfad etwas relativ sein sollte, die auf Ihre Klassenlader übergeben wurde: /home/user1/img/logo.gif =>/img/logo.gif

+0

hallo geholfen, muss ich einen Klassenlader schreiben Klassen zu laden/resources aus einem Pfad, der zur Laufzeit generiert wird. Daher ist es beim Start der VM nicht im ursprünglichen Klassenpfad verfügbar. Vielen Dank. – weima

+0

@weima, sehe mein Update, hoffe es hilft – Osw

+0

Danke, das hilft sehr. :) – weima

2

Enumeration ist eine sehr alte Java-Klasse, die von der neueren Sammlungen Bibliothek abgelöst worden ist. Sie können einen erhalten, indem eine Collection (eines einzelnen Elements) zu schaffen und dann Collections.enumeration() forderte sie auf:

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

Danke, das – weima