Erzeuge ein neues Objekt.
Mit Hilfe der vorzeichenlosen Bytes indexbyte1 und
indexbyte2 wird ein Index im (Laufzeit-)Konstantenpool der
aktuellen Klasse berechnet: (indexbyte1 << 8) |
indexbyte2. Mit Hilfe dieses Index kann die Klasse ermittelt
werden, von der ein Objekt erzeugt werden soll. Die Erzeugung eines neuen Objekts
erfolgt mit Hilfe des JVM-Befehls Beispiel 1: Die folgenden Programmausschnitte aus einem Quelltext bzw. auf Bytecodeebene
erzeugen ein neues Objekt der Klasse public class Test {
public static void public static void main(java.lang.String[]);
main(String[] args) { Code:
String s = new String(); 0: new #2; //class java/lang/String
3: dup
4: invokespecial #3;
//Method java/lang/String."<init>":()V
7: astore_1
} 8: return
} Die Angabe #2 aus Es sind 17 Konstanten im Konstantenpool enthalten. 1. Konstante: Methode von Klasse #5, Name/Typ #14 2. Konstante: Klasse #15 3. Konstante: Methode von Klasse #2, Name/Typ #14 4. Konstante: Klasse #16 5. Konstante: Klasse #17 6. Konstante: Utf8 <init> 7. Konstante: Utf8 ()V 8. Konstante: Utf8 Code 9. Konstante: Utf8 LineNumberTable 10. Konstante: Utf8 main 11. Konstante: Utf8 ([Ljava/lang/String;)V 12. Konstante: Utf8 SourceFile 13. Konstante: Utf8 Test.java 14. Konstante: Name #6, Typ #7 15. Konstante: Utf8 java/lang/String 16. Konstante: Utf8 Test 17. Konstante: Utf8 java/lang/Object Die 2. Konstante verweist zum UTF8-String "java/lang/String", der die Klasse
repräsentiert, von der ein neues Objekt erzeugt werden soll. Die zu dieser
Zeichenkette korrespondierende Klassendatei Beispiel 2: Die folgende Übersicht zeigt die Verwendung eines Konstruktors und eines statischen Initialisierers auf Bytecodeebene: public class Test { public class Test
extends java.lang.Object {
public Test();
Code:
0: aload_0
1: invokespecial #1; //Method
java/lang/Object."<init>":()V
4: return
static {};
Code:
static int a = 3; 0: iconst_3
1: putstatic #4; //Field a:I
4: return
public static void public static void
main(String[] args) { main(java.lang.String[]);
Code:
int b = 0; 0: iconst_0
1: istore_1
Test t = new Test(); 2: new #2; //class Test
5: dup
6: invokespecial #3; //Method
"<init>":()V
9: astore_2
b = a; 10: getstatic #4; //Field a:I
13: istore_1
} 14: return
} } Durch die Anweisungen Die Deklaration und Initialisierung der Klassenvariablen static int a; static { a = 3; } Die durch den Compiler erzeugten Befehle auf Bytecodeebene unterscheiden sich dadurch nicht.
Erzeuge ein neues Array (für primitive Datentypen).
Der Typ des Arrays atype ist durch einen Zahlenwert codiert:
Für das neu erzeugte Array wird Speicherplatz vom Heap bereitgestellt und
jedes Element des Arrays wird abhängig vom Typ mit einem Standardwert initialisiert.
Zur Erzeugung von Arrays für Referenztypen siehe
Beispiel: Im Beispiel wird zunächst ein int[] i = new int[3]; 0: iconst_3
1: newarray int;
3: astore_1
i[0] = 4; 4: aload_1
5: iconst_0
6: iconst_4
7: iastore Der JVM-Befehl
Dieser JVM-Befehl führt keine Operation aus (no operation). |
||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||