javaseiten.de   |   Version 0.6
 

5.6. Felder

Die Variablen einer Klasse (Instanzvariablen, Klassenvariablen) werden als Felder der Klasse bezeichnet. Für die Deklaration eines Feldes ist die .field-Direktive vorgesehen. Für die Deklaration von Feldern können zwei unterschiedliche Syntaxformen verwendet werden.

Felddeklaration:

.field <fieldmodifiers> <fieldname> <fielddescriptor> 
        [signature <fieldsignature>] [= <value>]

.field <fieldmodifiers> <fieldname> <fielddescriptor> 
        [signature <fieldsignature>] [= <value>]
  <direktives>
.end field

Die erste Syntax zur Felddeklaration muss in einer einzigen Zeile im Assemblerquelltext notiert werden. Ein Feld kann z.B. innerhalb eines Jasmin-Quelltextes als "deprecated" markiert werden. Hierzu steht eine geeignete Direktive zur Verfügung. Neben der genannten Direktive können auch noch weitere Direktiven innerhalb von .field und .end field auftreten (siehe dazu Abschnitt 5.8). Nach dem Schlüsselwort .field können die Feldmodifikatoren, der Name des Feldes und der Felddeskriptor der Reihe nach angeordnet werden. Mit dem Felddeskriptor wird der Typ des Feldes eindeutig charakterisiert. Einem Feld, das mit dem Modifikator final deklariert wird, kann der Wert value zugewiesen werden. Ferner kann die Signatur des Feldes angegeben werden. Eine Feldsignatur ist eine Zeichenkette, die den generischen Typ des Feldes repräsentiert. Als Beispiel soll der nachfolgende Java-Quelltext dienen, für den ein Äquivalent auf Assemblerebene gesucht wird.

/* FieldExample.java */

import java.util.*;

public class FieldExample {
  int i1;
  float[] f;
  static String s;
  
  int i2 = 3;
  final int i3 = 4;
  private static final int i4 = 5;
  
  Vector<Integer> v = new Vector<Integer>();
}

Das Listing FieldExample.java deklariert insgesamt sechs Felder. Zwei Felder sind mit dem Modifikator static versehen (Klassenvariablen) und einigen Felder wird ein Wert zugewiesen. Die Initialisierung von Feldern kann es erforderlich machen, den Default-Konstruktor entsprechend zu erweitern. Für die Definition einer Konstanten (das Feld besitzt die Modifikatoren static und final) ist keine Anspassung des Default-Konstruktors nötig, da die Informationen über den zugewiesenen Wert im Feldbereich und Konstantenpool der Klassendatei abgelegt werden (siehe dazu Abschnitt 4.2). Für die folgenden vier Felder ist keine Veränderung des Default-Konstruktors erforderlich:

Java-Quelltext                          Jasmin-Quelltext

int i1;                                 .field i1 I
float[] f;                              .field f [F
static String s;                        .field static s Ljava/lang/String;
private static final int i4 = 5;        .field private static final i4 I = 5

Die Wertzuweisungen für die Felder i2, i3 und v können wie folgt im Default-Konstruktor realisiert werden:

Java-Quelltext                    Jasmin-Quelltext

int i2 = 3;                       .field i2 I
                                  .method public <init>()V
                                  ...
                                    aload_0
                                    iconst_3
                                    putfield FieldExample/i2 I
                                  ...
                                  .end method

final int i3 = 4;                 .field final i3 I = 4
                                  .method public <init>()V
                                  ...
                                    aload_0
                                    iconst_4
                                    putfield FieldExample/i3 I
                                  ...
                                  .end method

Vector<Integer> v =               .field v Ljava/util/Vector; signature 
  new Vector<Integer>();            "Ljava/util/Vector<Ljava/lang/Integer;>;"
                                  .method public <init>()V
                                  ... 
                                    aload_0
                                    new java/util/Vector
                                    dup
                                    invokespecial java/util/Vector/<init>()V
                                    putfield FieldExample/v Ljava/util/Vector;
                                  ...
                                  .end method

Das nachfolgende Jasmin-Listing enthält das vollständige Programm und ist eine Umsetzung von FieldExample.java auf Assemblerebene.

Listing 5.8. FieldExample.j. Anwendung der Direktive .field.

; FieldExample.j

.bytecode 50.0
.class public FieldExample
.super java/lang/Object

.field i1 I
.field f [F
.field static s Ljava/lang/String;
.field i2 I
.field final i3 I = 4
.field private static final i4 I = 5
.field v Ljava/util/Vector; signature "Ljava/util/Vector<Ljava/lang/Integer;>;"

.method public <init>()V
  .limit stack 3
  .limit locals 1
  aload_0
  invokespecial java/lang/Object/<init>()V
  aload_0
  iconst_3
  putfield FieldExample/i2 I
  aload_0
  iconst_4
  putfield FieldExample/i3 I
  aload_0
  new java/util/Vector
  dup
  invokespecial java/util/Vector/<init>()V
  putfield FieldExample/v Ljava/util/Vector;
  return
.end method

Für die Angabe der Feldsignatur kann auch auf die Direktive .signature zurückgegriffen werden. Die folgenden beiden Syntaxformen sind in dem Sinne äquivalent, als dass beide zur selben Bytecodierung innerhalb der Klassendatei führen.

.field v Ljava/util/Vector; signature "Ljava/util/Vector<Ljava/lang/Integer;>;"

.field v Ljava/util/Vector;
  .signature "Ljava/util/Vector<Ljava/lang/Integer;>;"
  .end field

 

 

 

Diese Seite nutzt Google-Dienste - siehe dazu Datenschutz.

Copyright © 2006, 2007 Harald Roeder