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
Antwort
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.
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
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
"Ich habe das Gefühl, ein eleganterer Weg existiert." Nein, dies ist der dokumentierte korrekte Weg, dies zu tun. – Jay
public class SomeClass {
static {
System.out.println("Being called with the class is loaded");
initialize();
}
static void initialize(){}
}
Ist das Ihre Frage?
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
Yeap. Ich habe eigentlich nicht verstanden, was deine Frage an erster Stelle war. Class.forName ist so ziemlich der richtige Weg. – OscarRyz
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.
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
Eine weitere gute Möglichkeit, Addons zu realisieren, ist java.util.Serviceloader. Sieh dir die Javadocs an, sie erklären das Prinzip.
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. ...
Fragen Sie nach dem dynamischen Laden von Klassen oder dem Definieren des Verhaltens für die Initialisierung einer Klasse? –
Dynamisch geladene Klassen. – Baversjo