Annotations and Reflection
Constructor Lookup
A reflected constructor can create an object when the parameter types are known.
constructor metadata
A Constructor object describes how to create a class instance.
newInstance
Calling newInstance runs the constructor with the supplied arguments.
Constructor Lookup
ConstructorLookup.java
Replay: real traced execution (multi-file project)
import java.lang.reflect.Constructor;
public class ConstructorLookup {
static class Person {
private final String name;
private final int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
String label() {
return name + ":" + age;
}
}
public static void main(String[] args) throws Exception {
int age = 20;
Constructor<Person> constructor =
Person.class.getDeclaredConstructor(String.class, int.class);
Person person = constructor.newInstance("Ada", age);
System.out.println("person=" + person.label());
}
}
import java.lang.reflect.Constructor;
public class ConstructorLookup {
static class Person {
private final String name;
private final int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
String label() {
return name + ":" + age;
}
}
public static void main(String[] args) throws Exception {
int age = 17;
Constructor<Person> constructor =
Person.class.getDeclaredConstructor(String.class, int.class);
Person person = constructor.newInstance("Ada", age);
System.out.println("person=" + person.label());
}
}
import java.lang.reflect.Constructor;
public class ConstructorLookup {
static class Person {
private final String name;
private final int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
String label() {
return name + ":" + age;
}
}
public static void main(String[] args) throws Exception {
int age = 35;
Constructor<Person> constructor =
Person.class.getDeclaredConstructor(String.class, int.class);
Person person = constructor.newInstance("Ada", age);
System.out.println("person=" + person.label());
}
}
age ← 20, constructor ← ConstructorLookup$Person(java.lang.String,int)
18public static void main(String[] args) throws Exception {19 int age→ 20 = 20; //@age=17, 3520 Constructor<Person> constructor→ ConstructorLookup$Person(java.lang.String,int) =21 Person.class.getDeclaredConstructor(String.class, int.classint);22 Person person = constructor.newInstance("Ada", age20);this.name ← Ada, this.age ← 20
8Person(String nameAda, int age20) {9 this.name→ Ada = nameAda;10 this.age→ 20 = age20;11}person ← ⟨ConstructorLookup$Person A⟩
21 Person.class.getDeclaredConstructor(String.class, int.class);22 Person person→ ⟨ConstructorLookup$Person A⟩ = constructor.newInstance("Ada", age20);2324 System.out.println("person=" + person.label());25}String label()
13String label() {14 return nameAda + ":" + age20;15}System.out.println("person=" + person.label());
24 System.out.println("person=" + person.label());25}outputperson=Ada:20
age ← 17, constructor ← ConstructorLookup$Person(java.lang.String,int)
18public static void main(String[] args) throws Exception {19 int age→ 17 = 17;20 Constructor<Person> constructor→ ConstructorLookup$Person(java.lang.String,int) =21 Person.class.getDeclaredConstructor(String.class, int.classint);22 Person person = constructor.newInstance("Ada", age17);this.name ← Ada, this.age ← 17
8Person(String nameAda, int age17) {9 this.name→ Ada = nameAda;10 this.age→ 17 = age17;11}person ← ⟨ConstructorLookup$Person A⟩
21 Person.class.getDeclaredConstructor(String.class, int.class);22 Person person→ ⟨ConstructorLookup$Person A⟩ = constructor.newInstance("Ada", age17);2324 System.out.println("person=" + person.label());25}String label()
13String label() {14 return nameAda + ":" + age17;15}System.out.println("person=" + person.label());
24 System.out.println("person=" + person.label());25}outputperson=Ada:17
age ← 35, constructor ← ConstructorLookup$Person(java.lang.String,int)
18public static void main(String[] args) throws Exception {19 int age→ 35 = 35;20 Constructor<Person> constructor→ ConstructorLookup$Person(java.lang.String,int) =21 Person.class.getDeclaredConstructor(String.class, int.classint);22 Person person = constructor.newInstance("Ada", age35);this.name ← Ada, this.age ← 35
8Person(String nameAda, int age35) {9 this.name→ Ada = nameAda;10 this.age→ 35 = age35;11}person ← ⟨ConstructorLookup$Person A⟩
21 Person.class.getDeclaredConstructor(String.class, int.class);22 Person person→ ⟨ConstructorLookup$Person A⟩ = constructor.newInstance("Ada", age35);2324 System.out.println("person=" + person.label());25}String label()
13String label() {14 return nameAda + ":" + age35;15}System.out.println("person=" + person.label());
24 System.out.println("person=" + person.label());25}outputperson=Ada:35