2017-02-28 2 views
1

Ich brauche eine App, die während der Laufzeit eine andere Klasse laden und eine ihrer Instanzen erfolgreich deserialisieren kann, damit sie ihre Methoden ausführen und die Elementvariablen lesen kann .Laden einer kompilierten Klasse in Java und Deserialisieren ihrer Instanz aus einer Datei

Von dem, was ich bemerkt haben, können Sie diese Methoden nicht in Java Serialisierung, so denke ich über die Klasseninstanz in project2 Serialisierung, laden die kompilierte Klasse mit ClassLoader in project1, instanziieren und weisen Sie die entserialisierten Instanz von porject2 in project1 zur instanziierten geladenen Klasse.

Die serialisierte Klasse erbt dieselbe Elternklasse in beiden Projekten.

Ist dies der beste Weg zu gehen? Es ist ein Schulprojekt, so dass meine App jede andere Klasse akzeptieren kann, ohne den Code zu ändern.

TL; DR: Mein Plan ist es, eine kompilierte Klasse mit dem ClassLoader zu laden, so dass mein Projekt über diese Klasse (speziell die Methoden innerhalb) weiß und dann diese serialisierte Klasseninstanz innerhalb des Projekts lädt, damit ich die Daten bekommen kann aus der Instanz und zusammen mit der geladenen Klasse (jetzt kenne ich auch die Methoden), führen Sie die Methoden auf der deserialisierten Instanz aus.

+0

Danke; und Dankbarkeit ausgedrückt ;-) – GhostCat

Antwort

2

Sie sind falsch. Die Möglichkeit, eine Methode für ein Objekt aufzurufen, steht nicht im Zusammenhang mit der Serialisierung überhaupt.

Was ich meine: die Methodenimplementierung ist nicht Teil der serialisierten Daten! Die Java-Serialisierung schreibt nur Feld Daten in diesen Ausgabestrom.

Die Implementierung eines Verfahrens nur hängt von der Klasse Datei einiger Java-Klasse. Sie können Ihre Objekte so oft serialisieren und deserialisieren, wie Sie möchten - aber was passiert, wenn Sie eine Methode für ein solches Objekt aufrufen, wird nur von der Klassendatei bestimmt, die der entsprechende Klassenlader für Sie geladen zuerst Zugriff auf die entsprechende Klasse.

Wenn Ihr Ziel ist eigentlich nur über "eine Klasse dumps ein Objekt in eine binäre Darstellung"; und ein anderes Stück Code lädt diese Binärdaten; verwandelt es in ein Objekt; um auf dieses Objekt zuzugreifen; dann tun Sie nicht brauchen zwei Projekte. Sie müssen sich auch keine Gedanken über die "Methoden" machen. Solange Ihr ClassLoader die Klasse der zu serialisierenden Objekte kennt, wird alles funktionieren. Wählen Sie einfach ein Beispiel-Tutorial, wie dieses here und arbeiten Sie durch.

Aber: wenn Ihre Anforderung ist es, Methoden oder Zugriffsfelder beliebigen Objekte aufrufen; dann schauen Sie nicht in die Serialisierung, sondern in Java reflection.

Aber ein Wort der Warnung dort: Reflexionen klingt einfach, aber seien Sie versichert: es gibt viele viele Möglichkeiten für Sie, leicht falschen Code zu schreiben. Und weil Reflexion im Grunde eine Laufzeit Sache ist, hilft der Java-Compiler nicht viel. Sie schreiben Code, der vernünftig aussieht, kompiliert, Sie führen ihn aus, und Sie bekommen Ausnahmen, die Sie umwerfen.

In diesem Sinne ist Reflexion ein fortgeschrittenes Thema im Java-Lehrplan; und ich denke, du solltest lieber zurücktreten und mit deinen Lehrern klären, was genau sie von dir erwarten.

Angesichts Ihrer neuesten Updates: dann schauen Sie sich einfach in diesem Tutorial über Serialisierung (und vergessen Sie die Reflexion Teil). Und um Ihre Frage zu beantworten: Ja, das hört sich nach einem realisierbaren Ansatz an. Kann nicht mehr sagen; da Sie bisher keinen Code teilen.

+0

Hallo. Mein Plan ist, eine kompilierte Klasse mit dem ClassLoader zu laden, so dass mein Projekt über diese Klasse (speziell die Methoden darin) weiß und dann diese serialisierte Klasseninstanz innerhalb des Projekts lädt, so dass ich die Daten von der Instanz und zusammen mit dem geladenen erhalten kann Klasse (jetzt kenne ich die Methoden auch), führen Sie die Methoden auf der deserialisierten Instanz aus. Ich habe meine Frage bearbeitet, ich wollte sagen "Laden Sie eine andere Klasse und deserialisieren Sie eine seiner Instanz" –

+0

Siehe meine Updates. Aber bitte verstehen Sie: Wir helfen bei spezifischen Problemen ... und in diesem Sinne ist Ihre Anfrage eigentlich zu unspezifisch. – GhostCat

Verwandte Themen