javaseiten.de   |   Version 0.6
 

4.8. JVM-Befehlssatz: Kurzbeschreibung C

 

 

Befehl Operandenstapel Opcode
caload ..., arrayref, index --> ..., value 0x34

Lade einen char-Wert aus einem char-Array auf den Operandenstapel.

Bezeichner Typ Beschreibung
arrayref reference Referenz auf ein Array.
index int Index im Array.
value int  

Mit Hilfe von arrayref und index wird der Wert value ermittelt und auf den Stapel gelegt. Dabei ist value vom Typ int, da für die einzelnen Zeichen ein entsprechender Zahlenwert verwendet wird (für die einzelnen Zeichen gilt die Codierung für Unicode-Zeichen UTF-16).

Beispiel:

char[] c = {'A', 'B'};         0: iconst_2
                               1: newarray char
                               3: dup
                               4: iconst_0
                               5: bipush 65
                               7: castore
                               8: dup
                               9: iconst_1
                              10: bipush 66
                              12: castore
                              13: astore_1
char c0 = c[0];               14: aload_1
                              15: iconst_0
                              16: caload
                              17: istore_2

Mit castore werden zunächst die beiden Zahlenwerte 65 und 66 in das char-Array geschrieben. Dabei entspricht 65 dem Buchstaben "A" und 66 steht für "B". Anschließend erfolgt das Auslesen des ersten Elements (Index 0) mit caload.

 

 

castore ..., arrayref, index, value --> ... 0x55

Speichere einen char-Wert in ein char-Array.

Bezeichner Typ Beschreibung
arrayref reference Referenz auf ein Array.
index int Index im Array.
value int  

Auf dem Operandenstapel befinden sich, vor der Ausführung des Befehls, die Referenz auf das Array, der Index des Elements im Array und der zu speichernde int-Wert value (für die einzelnen Zeichen wird ein entsprechender Zahlenwert nach UTF-16 verwendet). Siehe auch das Beispiel zu caload.

 

 

checkcast indexbyte1 indexbyte2 ..., objectref --> ..., objectref 0xc0

Stelle fest, ob der Typ eines Objekts (Objektvariablen) in einen anderen bestimmten Typ umgewandelt werden kann.

Bezeichner Typ Beschreibung
indexbyte1 Vorzeichenloses Byte Index im (Laufzeit-)Konstantenpool.
indexbyte2 Vorzeichenloses Byte Index im (Laufzeit-)Konstantenpool.
objectref reference Referenz auf ein Objekt.

Mit Hilfe der vorzeichenlosen Bytes indexbyte1 und indexbyte2 wird ein Index im (Laufzeit-)Konstantenpool der aktuellen Klasse berechnet: (indexbyte1 << 8) | indexbyte2. Mit diesem Index kann eine entsprechende Referenz auf eine Klasse, ein Array oder ein Interface erhalten werden. Falls der Typ des durch objectref referenzierten Objekts in den ermittelten Klassen-, Array- oder Interface-Typ umgewandelt werden kann, bleibt der Operandenstapel unverändert. Kann die beabsichtigte Umwandlung (Cast) des Objekttyps nicht erfolgen, wird eine ClassCastException ausgelöst.

Beispiel 1:

Die Umwandlungen von Objekttypen durch Typ-Cast-Operatoren im folgenden Beispielprogramm sind alle bis auf die auskommentierte Anweisung zulässig.

public class Test {  
  public static void main(String[] args) {
    Object obj = new Integer(3);
    
    Integer i = (Integer)obj;
    Number n = (Number)obj;
    Comparable c = (Comparable)obj;
    //Byte b = (Byte)obj;  //Fehler: ClassCastException
    
    Object[] obja = new Integer[3];
    Integer[] ia = (Integer[])obja;
  }
}

Der Number-Cast-Operator ist erfolgreich, da die Klasse Integer die abstrakte Klasse Number erweitert. Die Typumwandlung zu Comparable ist ebenfalls zulässig, da Integer das Interface Comparable implementiert. Für jeden dieser Typumwandlungen wird durch den Java-Compiler ein checkcast-Befehl erzeugt.

Beispiel 2:

Der Typ des Objektvariablen obj ist zunächst Object. Unter Verwendung des Cast-Operators (Integer) erfolgt eine Umwandlung des Typs von obj, wobei die neue Objektvariable i deklariert und mit Hilfe des Cast-Operators initialisiert wird.

Object obj = new Integer(3);         0: new #2; //class java/lang/Integer
                                     3: dup
                                     4: iconst_3
                                     5: invokespecial #3; //Method 
                                        java/lang/Integer."<init>":(I)V
                                     8: astore_1
Integer i = (Integer)obj;            9: aload_1
                                    10: checkcast #2; 
                                        //class java/lang/Integer
                                    13: astore_2

 

 

 

Diese Seite nutzt Google-Dienste - siehe dazu Datenschutz.

Copyright © 2006, 2007 Harald Roeder