Speichern einer Java-Klasse

Hi!

Ich habe eine Klasse von einer URL geladen und will diese komplett auf der lokalen Platte speichern. Es ist also ein Objekt der Klasse Class, das ich abspeichern will.

Gruss - lutz

Ich habe eine Klasse von einer URL geladen und will diese
komplett auf der lokalen Platte speichern. Es ist also ein
Objekt der Klasse Class, das ich abspeichern will.

Hä? :o)

Langsam und von vorne. Du hast eine .class-Datei runtergeladen und abgespeichert? Wo ist das Problem?

Oder willst du wirklich wie du sagst ein Objekt, also eine Instanz einer Klasse speichern? (Das ginge über Serialisierung)

Grüße, Robert

Langsam und von vorne. Du hast eine .class-Datei runtergeladen
und abgespeichert? Wo ist das Problem?

Ich habe sie ja noch nicht abgespeichert. :smile: Da liegt das Problem. Vielleicht ist die Lösung einfach, nur mir fällts nicht auf.

Oder willst du wirklich wie du sagst ein Objekt, also eine
Instanz einer Klasse speichern? (Das ginge über
Serialisierung)

Ich habe ja noch keine Instanz erzeugt. Die will ich ja vorerst auch nicht, sondern die Klasse abspeichern, damit ich sie später laden kann und dann eine Instanz erzeugen kann. Wie sieht das denn aus, wenn man Serialisierung benutzt? Gibts da ein Beispiel irgendwo aufm Web?

Gruss - lutz

Ich habe sie ja noch nicht abgespeichert. :smile: Da liegt das
Problem. Vielleicht ist die Lösung einfach, nur mir fällts
nicht auf.

Gib mal einfach den URL zum .class-File im Browser ein, dann müßte er anbieten es runterzuladen. Falls das nicht funkt probiers mit einem gängigen Download-Proggi, das kommt dann sicher nicht auf die Idee mit dem File was andres zu machen als es runterzuladen. :smile:

Wie :sieht das denn aus, wenn man Serialisierung benutzt? Gibts
da ein Beispiel irgendwo aufm Web?

Das war wohl nicht das was du gesucht hast, aber du kannst jedes Objekt dessen Klasse das Interface Serializable implementiert über einen ObjectOutputStream in eine Datei schreiben bzw. mit einem ObjectInputStream wieder auslesen.

Beispiele findest du wie für alles was mit Java zu tun hat unter http://java.sun.com.

Grüße, Robert

Ich habe sie ja noch nicht abgespeichert. :smile: Da liegt das
Problem. Vielleicht ist die Lösung einfach, nur mir fällts
nicht auf.

Gib mal einfach den URL zum .class-File im Browser ein, dann
müßte er anbieten es runterzuladen. Falls das nicht funkt
probiers mit einem gängigen Download-Proggi, das kommt dann
sicher nicht auf die Idee mit dem File was andres zu machen
als es runterzuladen. :smile:

Naja, es geht hier im Forum doch um Java. Ich will das Abspeichern einer geladenen Klasse, in einem Java Programm verwirklichen. Wusste nicht, dass es so schwierig ist.

Gruss - lutz

Naja, es geht hier im Forum doch um Java. Ich will das
Abspeichern einer geladenen Klasse, in einem Java Programm
verwirklichen. Wusste nicht, dass es so schwierig ist.

Verzeih mir, wenn ich auf der Leitung stehe, eventuell habe ich das vorher mißverstanden.

Du schreibst ein eigenes Java-Programm und instanzierst eine beliebige Klasse, der Einfachheit halber z. b. java.lang.String. Dann veränderst du was am Zustand dieses Objekts, im Fall des Strings weist du z. B. was zu. Und dann willst du das Objekt auf die Platte speichern?

Das ginge wie beschrieben über Serialisierung, hier ein Beispiel:

ObjectOutputStream oOut = new ObjectOutputStream( new FileOutputStream( "dateiindieduspeichernmöchtest" ) );
oOut.writeObject( zuSicherndesObjekt );

Wieder kriegen tust du das Objekt über:

ObjectInputStream oIn = new ObjectInputStream( new FileInputStream( "dateiindiedugespeicherthast" ) );
KlasseDesObjekts oRead = (KlasseDesObjekts)oIn.readObject();

Grüße, Robert

Verzeih mir, wenn ich auf der Leitung stehe, eventuell habe
ich das vorher mißverstanden.

Nee! Ich bin doch froh, dass Du mir hilfst. Also absolut nichts zu verzeihen. Aber ein Missverständnis ist da doch.

Ich hole mir von einem http-server, auf dem eine java-klasse abgelegt wurde, *diese* Klasse. Ich lade sie mir, weil ich ja weiss wie die codebase lautet und wie die klasse heisst.
Nun habe ich sie im Speicher, aber ich würde sie mir gerne für später auf die Platte schreiben. Im Prinzip eine Kopie der Klasse, die ich vom http server geholt habe. Beide Klassen sollen identisch sein, d.h. ich kann die gespeicherte Klasse dann einfach laden wann ich will, ohne extra auf den http-server zuzugreifen.
Danke für Dein Beispiel. Trifft das denn das, was ich machen will? Auf den ersten Blick würde ich sagen, ja, aber ich bin erst Anfänger in Java (und SQL).

Gruss - lutz

Ich hole mir von einem http-server, auf dem eine java-klasse
abgelegt wurde, *diese* Klasse. Ich lade sie mir, weil ich ja
weiss wie die codebase lautet und wie die klasse heisst.
Nun habe ich sie im Speicher, aber ich würde sie mir gerne für
später auf die Platte schreiben.

OK, jetzt verstehe ich was du willst. :smile:

Ein kurzer Blick in die API-Doku zeigt, dass das offensichtlich nicht ohne weiteres möglich ist (falls ich nichts übersehen habe :o).

Man könnte es aber ohne allzugroßen Aufwand selber basteln. Siehe dazu das Beispiel das sie in der Doku von der Klasse ClassLoader drinnen haben, die Klasse NetworkClassLoader. In der Methode loadClassData() müßtest du nicht nur die Klasse aus dem Netz laden sondern sie halt auch in ein File schreiben und bei späteren Zugriffen aus der Datei laden. Das liese sich so allgemein ausbauen, dass er das für beliebige Klassen die mit der eigenen, von ClassLoader abgeleiteten Klasse lädst, transparent macht.

Allerdings, wenn du Anfänger bist, würde ich da eher noch die Finger davon lassen. Genauen Beispielcode kann ich dir dazu leider nicht geben, da, ich das nie gemacht habe und nur nach kurzer API Durchsicht sagen kann, dass es so gehen müßte. :o)

Grüße, Robert

Man könnte es aber ohne allzugroßen Aufwand selber basteln.
Siehe dazu das Beispiel das sie in der Doku von der Klasse
ClassLoader drinnen haben, die Klasse NetworkClassLoader. In
der Methode loadClassData() müßtest du nicht nur die Klasse
aus dem Netz laden sondern sie halt auch in ein File schreiben
und bei späteren Zugriffen aus der Datei laden. Das liese sich
so allgemein ausbauen, dass er das für beliebige Klassen die
mit der eigenen, von ClassLoader abgeleiteten Klasse lädst,
transparent macht.

Naja, ich habe den Teil zum Laden schon geschrieben, aber ich weiss nicht genau ob wie so ein Objekt in eine Datei schreiben kann, und das ohne Änderungen am Objekt vorzunehmen.

Geht das das Kopieren von einer URL direkt auf die lokale Platte leichter? Dann würde ich wenigstens weiterkommen.

Gruss - lutz

Naja, ich habe den Teil zum Laden schon geschrieben, aber ich
weiss nicht genau ob wie so ein Objekt in eine Datei schreiben
kann, und das ohne Änderungen am Objekt vorzunehmen.

Jetzt haben wir wieder Begriffsverwirrung. :smile:

Du willst so wie ich das verstanden habe eine Klasse in eine Datei schreiben, kein Objekt. Objekt wäre die Serialisierung, aber da muß die Klasse bekannt sein, d. h. du müßtest beim wiederherstellen wieder die Klasse laden.

Geht das das Kopieren von einer URL direkt auf die lokale
Platte leichter? Dann würde ich wenigstens weiterkommen.

Nö, das läuft sich auf dasselbe raus. Ich schilde mal detaillierter wie es gehen könnte, entscheide selber obs dir zu aufwendig/kompliziert ist.

Hier mal den Beispielcode aus der API-Doku:

class NetworkClassLoader extends ClassLoader {
 String host;
 int port;

 public Class findClass(String name) {
 byte[] b = loadClassData(name);
 return defineClass(name, b, 0, b.length);
 }

 private byte[] loadClassData(String name) {
 // load the class data from the connection
 . . .
 }
 } 

findClass() wird von loadClass() benutzt um eine Klasse zu finden, wenn die übergeordneten ClassLoader-Klassen die Klasse nicht finden könnten (Der „Parent“ aller ClassLoaders sucht standardmäßig im CLASSPATH).

findClass() holt jetzt die Klasse als byte-Array über loadClassData, erstellt daraus ein Class-Object und gibt dieses zurück.

Und hier mußt du ansetzen, in zuerst prüfst du ob ob die Datei schon vorhanden ist, wenn nicht holst du die Daten über einen Socket und HTTP (einfach Verbindung öffnen, und einfach ein GET mit dem URL absetzen). Die Daten die du dann zurückkriegst schreibst du einerseits auf die Platte (FileOutputStream) und gibst es dann als byte-Array zurück (als solches kannst du es auch vom Socket-Inputstream holen.

Bei allen weiteren Zugriffen ist die Datei dann schon da, du liest sie einfach aus und gibst den Inhalt wiederum als byte-Array zurück.

Die Klasse lädst du dann mit deinem eigenen ClassLoader.

Alternativ könntest du die Datei auch irgendwo in den CLASSPATH spielen, dann findet sie auch der Standard-ClassLoader.

Ich hoffe das war jetzt so ausgedrückt, dass du ungefähr weißt was ich meine. :smile:

Grüße, Robert

Danke Robert! Du hast mir sehr geholfen!

Gruss - lutz