Annotations and Reflection
Field Access
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
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);
}
}
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");this.value ← 5
7Box(int value5) {8 this.value→ 5 = value5;9}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
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");this.value ← 9
7Box(int value9) {8 this.value→ 9 = value9;9}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
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");this.value ← 12
7Box(int value12) {8 this.value→ 12 = value12;9}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