Klasse über ein Netzwerk nachladen
-
Aloha
Wie schon im Titel beschrieben, geht es mir darum, eine Klasse über ein Netzwerk von Rechner A auf Rechner B nach zu laden.
Mein erster Gedanke, dass sich die VM des Rechners B bei der VM des Rechners A meldet und die beiden das unter sich ausmachen, erwies sich als falsch.
Soweit ich ich das prozedere jetzt verstanden habe, muss ich den Inhalt der .class Datei der gewünschten Klasse einlesen (vermutlich binär), diesen über das Netzwerk zu Rechner B schicken und dort wieder in eine Datei speichern. Zu guter letzt ruf ich den ClassLoader auf mit dem Namen der Klasse, die geladen werden soll.
Mein Gedanke ist jetzt aber, dass die Datei in einem bestimmten Verzeichnis liegen muss, damit der ClassLoader sie findet. Oder irre ich mich da?
Zudem, wenn ich eh schon den Inhalt der .class Datei auf dem Rechner B in einer Variable gespeichert habe, muss ich die noch extra in eine Datei schreiben oder gibt es die Möglichkeit, dem ClassLoader direkt die Variable zu geben?
Ich hoff mal ihr könnt mir irgendwie helfen.
MfG
Shelling
-
Das was du vorhast klingt sehr nach RMI (http://download.oracle.com/javase/tutorial/rmi/overview.html). Ich hab damit zwar noch nicht gearbeitet, aber ich denke das es dir die Details, zu denen du Fragen hast, erledigen könnte.
-
Danke für den Link, werd mir das Ganze im laufe des Tages nochmals genauer durchlesen.
Beim ersten überfliegen hab ich aber eher den Eindruck, als würde sich der Artikel hauptsächlich mit Remote Procedure Calls mittels RMI befassen, als das wirkliche verschicken einer Klasseninstanz auf einen Rechner, auf dem die Klasse nicht verfügbar ist. Es wird zwar am Anfang erwähnt, dass es für eine verteilte Anwendung nötig ist Klassendefinitionen für Instanzen, die herumreisen, zu laden, aber es wird scheinbar nicht genau darauf eingegangen, wie das geschieht.
Vielleicht irre ich mich aber auch, wie gesagt, ich werd mich im laufe des Tages dransetzen und mich spätestens heute Abend mit einer Lösung oder weiteren Frage melden.
MfG
Shelling
-
Hallo,
ich hatte auch mal dieses Problem. Es geht hierbei weniger um das Netzwerk, sondern eher, dass du .class-Dateien zur Laufzeit nachladen möchtest. Über RMI kannst du dann auf den geladenen Byte-Code zugreifen.
Also zu meiner Zeit (ca. vor 3 Jahren) war es einfach nicht möglich weder direkt unter Java oder über JNI Byte-Code nachzuladen. Ich musste damals die neuen .class-Dateien/jars in den Klassenpfad einbinden und die Anwendung selbst neu starten lassen.
Da das aber auch jede andere Anwendung so betreibt (siehe Eclipse oder Netbeans -> Plugin-System), so vermute ich einfach mal es ist noch immer einfach nicht möglich.
-
shadow schrieb:
Also zu meiner Zeit (ca. vor 3 Jahren) war es einfach nicht möglich weder direkt unter Java oder über JNI Byte-Code nachzuladen. Ich musste damals die neuen .class-Dateien/jars in den Klassenpfad einbinden und die Anwendung selbst neu starten lassen.
Da das aber auch jede andere Anwendung so betreibt (siehe Eclipse oder Netbeans -> Plugin-System), so vermute ich einfach mal es ist noch immer einfach nicht möglich.So ein Blödsinn, Bytecode nachladen geht mit dem URLClassLoader mit 2 Zeilen Code, auch schon seit Jahren. Eclipse und NetBeans machen das genau so (ok Equinox hat sogar noch seine eigenen ClassLoader Implementierungen weil dahinter noch viel mehr steht als nur Bytecode nachladen)
-
Wow, was für eine Neuigkeit
Dir ist schon klar, dass wenn du eine Klasse über den ClassLoader nachladen möchtest, diese bereits im Klassenpfad enthalten sein muss? Denkst du ernsthaft, dass sich professionelle Java-Anwendungen freiwillig neustarten lassen wenn sie die Plugins einfach so zur Laufzeit laden könnten?
Info: http://freejavaclass.com/articles/java/java_class_loaders.jsp------------------------
Edit:
Ich muss mich korrigieren! Habe gerade gesehen, dass man ja die Propertyjava.class.path
setzen kann. Damit müsste es dann über den ClassLoader gehen. Ungefähr so:
Class type = ClassLoader.getSystemClassLoader().loadClass(name); Object obj = type.newInstance();
Hab damals wohl den Wald vor lauter Bäumen nicht gesehen
-
Haha!
Dir ist schon klar, dass wenn du eine Klasse über den ClassLoader nachladen
> möchtest, diese bereits im Klassenpfad enthalten sein muss?
Nein muss sie nicht, ich kann mir meine Klassen auch aus einer Datenbank bin wenn ich lustig bin.
> Denkst du ernsthaft, dass sich professionelle Java-Anwendungen freiwillig
> neustarten lassen wenn sie die Plugins einfach so zur Laufzeit laden könnten?
Musst du nicht, klick bei Eclipse auf "Apply changes" nach der Installation, fertig. Natürlich ist ein Neustart besser, weil Plugins Änderungen an der Workbench vornehmen die evtl. nicht alle übernommen werden ohne Neustart.Aber erstmal groß das Maul aufreißen...
-
shadow schrieb:
Edit:
Ich muss mich korrigieren! Habe gerade gesehen, dass man ja die Propertyjava.class.path
setzen kann. Damit müsste es dann über den ClassLoader gehen. Ungefähr so:
Class type = ClassLoader.getSystemClassLoader().loadClass(name); Object obj = type.newInstance();
Hab damals wohl den Wald vor lauter Bäumen nicht gesehen
Nein, das geht so nicht ...
-
Werd erwachsen und versteck deine pöbelige Art nicht hinter einer anonymen Antwort. Du bist ein einziger großer Witz
-
shadow schrieb:
Werd erwachsen und versteck deine pöbelige Art nicht hinter einer anonymen Antwort. Du bist ein einziger großer Witz
Tut mir leid dass ich hier nicht angemeldet bin, habe den Thread durch Zufall entdeckt, tut mir auch leid dass ich nicht so gut unterschwellig passiv aggressiv sein kann wie du, evtl. fehlt mir dazu die Forumerfahrung die die Mitglieder hier haben.
Sonst kann ich zu dir nicht mehr viel sagen, da du offensichtlich keine Ahnung hast wovon du redest solltest du einfach nicht mehr in der Java Abteilung hier posten, helfen tuen deine falschen Behauptungen dem Fragenden nämlich auch nicht...
-
http://download.oracle.com/javase/1.5.0/docs/api/java/lang/ClassLoader.html
In der Klassenbeschreibung selbst wird skizziert, wie man einen NetworkClassLoader schreiben kann, der dann Klassen anhand von Binärdaten lädt.
-
Dasd schrieb:
http://download.oracle.com/javase/1.5.0/docs/api/java/lang/ClassLoader.html
In der Klassenbeschreibung selbst wird skizziert, wie man einen NetworkClassLoader schreiben kann, der dann Klassen anhand von Binärdaten lädt.
Ist sogar gar nicht notwendig, denn schließlich hab ich in meiner ersten Antwort schon den Groschen fallen lassen, dass es bereits eine CL Implementierung gibt die genau das macht, aber shadow hielt's wohl nicht für nötig das zu lesen oder sich zu informieren bevor er pampig wurde
-
Sorry, dass ich mich so lange in Schweigen geübt habe...
Wir habens jetzt mit dem URLClassLoader gelöst. Nach einigen Problemen worunter auch dieser Bug war, haben wir es vermutlich etwas umständlicher gelöst, als die wirklichen Profis es machen würden.
Wir schicken die .class Datei nun einfach übers Netzwerk, speichern sie auf dem anderem Rechner und laden sie mit dem URLClassLoader. Vll nicht unbedingt elegant, aber es funktioniert immerhin wie es soll.
Ich bedanke mich für eure Hilfe und nochmal entschuldigung, dass ich so lange abwesend war. Das Programm hatte einfach Vorrang.
MfG
Shelling