Reflection can look up a field and read its value from an object.

field metadata A Field object describes one field declared on a class.
reflected read Calling get on a Field reads that field from a specific object.

Field Access

start
FieldAccess.java
Replay: real traced execution (multi-file project)
import java.lang.reflect.Field;

public class FieldAccess {
    static class Box {
        public int value;

        Box(int value) {
            this.value = value;
        }
    }

    public static void main(String[] args) throws Exception {
        int start = 5;
        Box box = new Box(start);
        Field field = Box.class.getDeclaredField("value");
        int loaded = (int) field.get(box);

        System.out.println("loaded=" + loaded);
    }
}
import java.lang.reflect.Field;

public class FieldAccess {
    static class Box {
        public int value;

        Box(int value) {
            this.value = value;
        }
    }

    public static void main(String[] args) throws Exception {
        int start = 9;
        Box box = new Box(start);
        Field field = Box.class.getDeclaredField("value");
        int loaded = (int) field.get(box);

        System.out.println("loaded=" + loaded);
    }
}
import java.lang.reflect.Field;

public class FieldAccess {
    static class Box {
        public int value;

        Box(int value) {
            this.value = value;
        }
    }

    public static void main(String[] args) throws Exception {
        int start = 12;
        Box box = new Box(start);
        Field field = Box.class.getDeclaredField("value");
        int loaded = (int) field.get(box);

        System.out.println("loaded=" + loaded);
    }
}
  1. start ← 5

    12public static void main(String[] args) throws Exception {13    int start→ 5 = 5;  //@start=9, 1214    Box box = new Box(start);15    Field field = Box.class.getDeclaredField("value");
  2. this.value ← 5

    7Box(int value5) {8    this.value→ 5 = value5;9}
  3. box ← ⟨FieldAccess$Box A⟩, field ← public int FieldAccess$Box.value

    13    int start = 5;  //@start=9, 1214    Box box→ ⟨FieldAccess$Box A⟩ = new Box(start);15    Field field→ public int FieldAccess$Box.value = Box.class.getDeclaredField("value");16    int loaded→ 5 = (int) field.get(box⟨FieldAccess$Box A⟩);1718    System.out.println("loaded=" + loaded5);19}
    outputloaded=5
  1. start ← 9

    12public static void main(String[] args) throws Exception {13    int start→ 9 = 9;14    Box box = new Box(start);15    Field field = Box.class.getDeclaredField("value");
  2. this.value ← 9

    7Box(int value9) {8    this.value→ 9 = value9;9}
  3. box ← ⟨FieldAccess$Box A⟩, field ← public int FieldAccess$Box.value

    13    int start = 9;14    Box box→ ⟨FieldAccess$Box A⟩ = new Box(start);15    Field field→ public int FieldAccess$Box.value = Box.class.getDeclaredField("value");16    int loaded→ 9 = (int) field.get(box⟨FieldAccess$Box A⟩);1718    System.out.println("loaded=" + loaded9);19}
    outputloaded=9
  1. start ← 12

    12public static void main(String[] args) throws Exception {13    int start→ 12 = 12;14    Box box = new Box(start);15    Field field = Box.class.getDeclaredField("value");
  2. this.value ← 12

    7Box(int value12) {8    this.value→ 12 = value12;9}
  3. box ← ⟨FieldAccess$Box A⟩, field ← public int FieldAccess$Box.value

    13    int start = 12;14    Box box→ ⟨FieldAccess$Box A⟩ = new Box(start);15    Field field→ public int FieldAccess$Box.value = Box.class.getDeclaredField("value");16    int loaded→ 12 = (int) field.get(box⟨FieldAccess$Box A⟩);1718    System.out.println("loaded=" + loaded12);19}
    outputloaded=12