getfield pops objectref (a reference to an object) from
the stack, retrieves the value of the field identified by <field-spec>
from objectref, and pushes the one-word or two-word value onto the
operand stack.
For example, if you have the class:
package xyz;
class Point {
public int xCoord, yCoord;
};
Then,
assuming p is an instance of the class Point, writing the Java expression:
int x = p.xCoord;
generates
a call to getfield like:
aload_1 ; push object in local varable 1 (i.e. p) onto the stack
getfield xyz/Point/xCoord I ; get the value of p.xCoord, which is an int
istore_2 ; store the int value in local variable 2 (x)
In
Jasmin, getfield takes two parameters, <field-spec> and
<descriptor>. <field-spec> gives classname, the name of the
class that defines the field, as well as fieldname, as the name of the
field itself. In the example above, the <field-spec> is
"xyz/Point/xCoord", indicating that the classname is "xyz/Point" and the
fieldname is "xCoord". <descriptor> describes the type of data
held in the field, and is a standard Java type descriptor (see Chapter 4 for a
full description of type descriptors). In the example above, <descriptor>
is "I", since the field holds an integer.
getfield first resolves classname to a Java class. Then it
locates the fieldname in that class, determining the width of the
field (in bytes) and its offset (in bytes) from the base of the object
data. The type of the field must match <descriptor>. See Chapter 7 for
more on how fields are resolved
To retrieve the value for the field, getfield obtains the bytes
starting at offset and extending for width bytes from the start
of objectref's instance data, expands it to either a 4-byte or 8-byte
value, and pushes the value onto the operand stack.