2013-06-09 12 views
6

In Java ist es eine Möglichkeit, die Schritte zu trennen, die bei der Objekterstellung geschehen:Erstellen eine unkonstruierten Objektinstanz

  • Speicherzuordnung
  • Objektbau

Mit anderen Worten, es gibt High-Level-Konstrukte (möglicherweise unter Verwendung von Refektion?), die die Bytecode-Anweisungen new (Speicherzuordnung) und invokespecial (Objektkonstruktion) genau abbilden.

Keine besondere Verwendung, eher wie eine Kuriosität Sache.

Antwort

3

Nein, dafür gibt es im JDK keine API (Reflektion oder andere). Sie können jedoch den Byte-Code zur Laufzeit selbst manipulieren, indem Sie Bibliotheken verwenden, die das tun. Beispiel: http://asm.ow2.org/

+0

sogar mit Bytecode-Manipulation erhalten Sie keinen Zugriff auf den Speicher, bevor der jlo-Konstruktor normal beendet wurde. –

0

Die JVM erstellt Objekte, bevor sie dem Konstruktor übergeben werden. Wenn ein Konstruktor einer abgeleiteten Klasse vor dem Verketten an den Basisklassenkonstruktor eine Ausnahme auslöst, würde ich erwarten, dass die abgeleitete Klasse Finalize für das Objekt ausgeführt wird, ohne dass jemals ein Teil des Basiskonstruktors ausgeführt wurde.

+1

Umm, führt der Basisklassenkonstruktor * vor * den Konstruktor der abgeleiteten Klasse nicht aus? –

+0

@OliCharlesworth: Der abgeleitete Klassenkonstruktor muss mit einem Aufruf des Basisklassenkonstruktors beginnen, aber die Auswertung der Parameter dieses Aufrufs kann fehlschlagen (z. B. wenn der abgeleitete Konstruktor den Parameter "foo" annimmt und den Basiskonstruktor aufruft) Mit dem Wert '1/foo 'würde das Aufrufen des abgeleiteten Konstruktors mit einem' foo'-Wert von Null eine Ausnahme auslösen, bevor der Basiskonstruktor ausgeführt wird. – supercat

2

weiß nicht, wie man den 2. Teil - Konstruktor darauf aufrufen.

+0

Interessant, vielen Dank für das Hinweis auf dieses Paket. Ich habe versucht, einen Verweis auf den Standard "" -Konstruktor mit Class.getDeclaredMethod(), aber kein Glück. – Nick

Verwandte Themen