2009-05-18 3 views
0

Ich habe ein Java-Projekt, das eine "Addon" -Schnittstelle benötigt. Ich dachte darüber nach, eine Art von Klassendateien mit Standardmethoden wie initialize() und shutdown() zu laden, die aufgerufen werden, nachdem die Klasse in die Anwendung geladen wurde. Ist das der Weg, es zu tun? Wie würde ich dieses Problem angehen?Java-Klassen einbinden und zur Laufzeit ausführen

+0

Fragen Sie nach dem dynamischen Laden von Klassen oder dem Definieren des Verhaltens für die Initialisierung einer Klasse? –

+0

Dynamisch geladene Klassen. – Baversjo

Antwort

3

Werfen Sie einen Blick auf die Class Klasse, insbesondere die forName Methode, mit der Sie eine Klasse namentlich verweisen können. Jede Klasse im Pfad kann so geladen werden. Ob Nachladen möglich ist, weiß ich nicht.

In jedem Fall muss jede Klasse, die Sie dynamisch laden möchten, Ihre benutzerdefinierte Schnittstelle AddOn implementieren und somit initialize und shutdown implementieren.

+0

Das hat funktioniert! Ich weiß nicht, ob dies der "richtige" Weg ist, und ich freue mich über Feedback. Beachten Sie, dass dies nur für das Laden einer Klasse gilt: Klasse classfoo = Class.forName ("addonclass"); Objekt foo = null; Objekt [] foo2 = null; classfoo.getMethod ("initialisieren"). Invoke (foo, foo2); – Baversjo

+0

Freut mich, dass es funktioniert! Ich bin auch an Rückmeldungen über den "richtigen" Weg interessiert. Ich habe das Gefühl, ein eleganterer Weg existiert ... – Stephan202

+0

"Ich habe das Gefühl, ein eleganterer Weg existiert." Nein, dies ist der dokumentierte korrekte Weg, dies zu tun. – Jay

-1
public class SomeClass { 
    static { 
     System.out.println("Being called with the class is loaded"); 
     initialize(); 
    } 
    static void initialize(){} 
} 

Ist das Ihre Frage?

+0

Schön :) Aber wie kann ich eine Klasse aus einer Datei laden und ausführen? Die Klasse wird nicht mit der Anwendung kommen, der Benutzer wird das Addon "herunterladen" und es in den Ordner "Addons" hinzufügen. Die Anwendung lädt beim Start alle Addons. – Baversjo

+0

Yeap. Ich habe eigentlich nicht verstanden, was deine Frage an erster Stelle war. Class.forName ist so ziemlich der richtige Weg. – OscarRyz

1

Zuerst benötigen Sie eine ClassLoader; Sie können die aktuelle mit getClass().getClassLoader() erhalten, aber dann müssen Ihre Addon-Klassen im Klassenpfad sein. Wahrscheinlich möchten Sie einen benutzerdefinierten Classloader erstellen, der Ihr Addon-Verzeichnis durchsucht.

Sobald Sie die ClassLoader haben, können Sie es zu load a class verwenden. Dies gibt Ihnen ein Class Objekt; Sie können dann über Reflection die Methode initialize() aufrufen, sofern diese vorhanden ist.

+0

Sie benötigen nur Ihren eigenen Klassenlader, wenn Sie eine nicht standardmäßige Möglichkeit zum Laden der Klasse haben möchten. Wenn die Klasse als eine ".class" -Datei in einem Ordner auf dem Klassenpfad existiert, wird der Standard-Klassenlader es tun. Wenn Sie beispielsweise die Klasse aus dem Internet im Hintergrund herunterladen möchten, benötigen Sie einen benutzerdefinierten Klassenlader. – Jay

0

Eine weitere gute Möglichkeit, Addons zu realisieren, ist java.util.Serviceloader. Sieh dir die Javadocs an, sie erklären das Prinzip.

1

Wenn Sie etwas anspruchsvoller betrachten, können Sie versuchen: http://jpf.sourceforge.net.

... JPF bietet eine Laufzeit-Engine, die "Plug-Ins" dynamisch erkennt und lädt. Ein Plug-in ist eine strukturierte Komponente, die sich selbst mit JPF über ein "Manifest" beschreibt. ...