Klasse über ein Netzwerk nachladen



  • 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 Property

    java.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 Property

    java.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


Anmelden zum Antworten