[Refactoring] ClassLoader Verzeichnis durchsuchen lassen

  • Themenstarter Themenstarter Knecht Purpecht
  • Beginndatum Beginndatum
K

Knecht Purpecht

Gast
Hallo,

ich würde einer Anwendung gerne eine Art von Plug-In-System einbinden. Dazu habe ich mir gedacht, dass es einen Ordner gibt, in welchem class-Dateien liegen. Die dadurch repräsentierten Klassen dürfen allerdings in verschiedenen Packages liegen, also im Dateisystem in unterschiedlichen Ordnern.

Zum Laden der Klassen während der Laufzeit wollte ich dann ein ClassLoader-Objekt verwenden (Alternativen gibt es ja, soweit ich weiß, keine).

Meine Frage ist nun: Wie kann ich möglichst komfortabel sämtliche Klassen in diesem Plug-In-Ordner laden? Theoretisch müsste ich rekursiv alle Unter-Ordner nach *.class-Dateien durchsuchen und mir aus den Pfaden dann den entsprechenden Klassen-Namen zusammen basteln. Das erscheint mir jedoch etwas zu kompliziert, weil ich dann auch noch den Pfad-Separator des entsprechenden OS unterscheiden müsste.
Gibt es da vielleicht schon eine Sequenz von Methoden-Aufrufen, die genau das erfüllt?
 
Nach meiner Erfahrung zu dieser Art Frage gibt es zwei Möglichkeiten:
1) Du brauchst das eigentlich gar nicht, aber hättest es gerne, weil plugins 'in' sind 🙂 In dem Fall würde ich mir die Arbeit sparen

2) Du hast einen echten Use Case dafür und willst auf diese Art eine flexible Anwendungsarchitektur realisieren. In diesem Fall solltest du zu einer bestehenden Lösung (OSGi) greifen, weil plugin Architektur sehr viel komplizierter ist als ein paar Klassen mit einem Classloader zu laden.
 
Mal ausgehend davon, dass du 3) das ganze nur aus Interesse und Spaß an der Sache probieren willst: dann sollte das Verfahren die Klassennamen zusammenzubauen das einfachste sein.
Außerdem versteh ich nicht, wofür du die Pfadseperators brauchst? Du kannst dir einen URLClassLoader erstellen, der auf den Ordner mit den Classdateien konfiguriert ist. Der erledigt das Laden der Klassen für dich. Beim Zusammenbauen der Klassennamen brauchst du auch keine Seperatoren - du musst nur nach jedem Ordnernamen ein "." anhängen. Oder versteh ich dich jetzt falsch?
 
Vielleicht hätte ich nicht Plug-In sagen sollen; ganz so komplex soll es tatsächlich nicht werden. Eigentlich geht es eher um Klassen, die von einem Interface erben und dort eine konkrete Methode implementieren. Diese Methode wird dann anschließend vom Programm ausgeführt.

Dem Benutzer soll also die Möglichkeit eingeräumt werden, eine konkrete Implementierung für diese Methode anzugeben und anschließend in der Anwendung dann auszuführen.

Für diesen Fall sollte mein Ansatz völlig ausreichend sein (hoffe ich).
 
Ich versteh dein Problem trotzdem nicht, den Ordner rekursiv nach *.class Dateien zu durchsuchen und die zu laden sind vielleicht 15 Zeilen.
 
Dafür kann man Prima den Serviceloader (in JavaSE bereits enthalten) nutzen, solange man sicherstellt, dass immer nur eine Implementierung des Interfaces im Classpath ist (sollten es mehrere sein, muss das Programm sich für eine entscheiden).

Ansonsten einfach den User den Namen der Klasse übergeben lassen und eine Factory mit Class.forName nutzen.
 
Es soll ja gerade mehr als nur eine Implementierung der Methode zur Auswahl stehen.

Grob kann man sich das ganze wie Filter für Bilddateien vorstellen. Man übergibt der Methode ein Bild und die entsprechende Implementierung liefert dann ein neues (gefiltertes) Bild zurück.

Im Menu soll der Benutzer dann alle möglichen Implementierungen für Filter zur Auswahl haben. Kennt man das Interface, kann der Benutzer ebenfalls selbst eine Implementierung schreiben, die Klasse in den Ordner verschieben und anschließend im Programm auswählen.

Ich habe das Ganze jetzt auch irgendwie mit einem ClassLoader zusammen gefrickelt, allerdings kommt das wohl noch nicht ganz so mit Klassen klar, die in eigenen Packages liegen. Liegt bestimmt am Pfadnamen, der nicht der Namenskonvention für Klassen entspricht. Das weiß ich eben nicht. Soll aber auch nicht weiter tragisch sein, dann ist der Benutzer für Implementierungen eben gezwungen, auf Packages zu verzichten.
 

Neue Themen


Zurück
Oben