Ist es in Java möglich, eine leere Instanz der Klasse zu erstellen, ohne dass ein Arg-Konstruktor die Reflexion verwendet?
Habe ich eine Klasse, die nicht Standard-Konstruktor. Und ich brauche einen Weg, um 'leere' Instanz dieser Klasse. "leer" bedeutet, dass nach der Instanziierung der ganzen Klasse Felder hat, die default-Werte
wie null, 0 usw.
Ich Frage deshalb, weil ich in der Lage sein müssen serialisieren/desirialize großen Baum von Objekten. Und ich habe keinen Zugang zu Quellen, die diese Objekte, Klassen und Klassen, die weder Standard-Konstruktoren noch implementiert serializable. Es ist wahrscheinlich keine sehr gute Idee zu versuchen, zu serialisieren, die eine solche Struktur, aber die alternative ist, es zu konvertieren, um etwas mehr leicht serialisierbar.
InformationsquelleAutor der Frage Vladimir | 2010-11-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mit standard-Reflexion, Nein, aber es ist eine Bibliothek, kann es für Sie tun: objenesis.
Es ist speziell zum instanziieren von Klassen ohne standardkonstruktoren, und es ist verwendet durch andere Serialisierung Bibliotheken, wie xstream.
Hinweis: der Konstruktor kann nicht aufgerufen werden, in diesen Fällen (aber das ist vermutlich das, was Sie wollen).
InformationsquelleAutor der Antwort Brad Cupit
Mit Klasse-Instanz bereitgestellt, die als variable clazz:
wie beschrieben in http://www.javaspecialists.eu/archive/Issue175.html
InformationsquelleAutor der Antwort mcveat
Ihre Lösung wird von der JVM-spezifisch.
Wenn Sie eine portable Lösung verwenden Sie eine 3rd-party-Bibliothek.
Für Suns JVM-v1.5 Sie können dies tun:
Den relevanten Klassen in XStream sind:
InformationsquelleAutor der Antwort johnstok
Die einzige Lösung, die ich denken kann, wäre die Verwendung eines bytecode-manipulation-Bibliothek wie javassist zum hinzufügen eines Standard-Konstruktor.
InformationsquelleAutor der Antwort Maurice Perry
Wenn Ihre Klasse hat kein anderer Konstruktor, dann erstellt der compiler einen für Sie. Haben Sie vielleicht eine no-arg Konstruktor und nicht erkennen, es.
Wenn Sie nicht schreiben Sie einen no-arg-Konstruktor, und Sie gehören auch eine Konstruktor ein argument, dann wird der compiler nicht geben. Reflexion wird nicht helfen, entweder: wenn Sie versuchen, einen no-arg-Konstruktor und gibt es nicht, was erwartest du, was passiert?
Tut es nicht klingen wie Sie können Java-Objekt-Serialisierung mit java.lang.Serializable, aber das ist nicht Ihre einzige Wahl. Sie können auch XML oder JSON, oder Prototyp-Puffer, oder irgendeines anderen Protokolls, die bequem ist.
InformationsquelleAutor der Antwort duffymo
Testen Sie es: sehen Sie, wenn yourObject.Klasse.newInstace() arbeiten. Wenn nicht, dann ich denken kann, ist das erstellen einer Prototyp-Objekt durch Aufruf der übliche Konstruktor setzen Sie die Felder auf null zu setzen und dann zu Klonen.
InformationsquelleAutor der Antwort Hannes de Jager