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

age
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());
    }
}
  1. 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);
  2. this.name ← Ada, this.age ← 20

    8Person(String nameAda, int age20) {9    this.name→ Ada = nameAda;10    this.age→ 20 = age20;11}
  3. 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}
  4. String label()

    13String label() {14    return nameAda + ":" + age20;15}
  5. System.out.println("person=" + person.label());

    24    System.out.println("person=" + person.label());25}
    outputperson=Ada:20
  1. 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);
  2. this.name ← Ada, this.age ← 17

    8Person(String nameAda, int age17) {9    this.name→ Ada = nameAda;10    this.age→ 17 = age17;11}
  3. 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}
  4. String label()

    13String label() {14    return nameAda + ":" + age17;15}
  5. System.out.println("person=" + person.label());

    24    System.out.println("person=" + person.label());25}
    outputperson=Ada:17
  1. 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);
  2. this.name ← Ada, this.age ← 35

    8Person(String nameAda, int age35) {9    this.name→ Ada = nameAda;10    this.age→ 35 = age35;11}
  3. 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}
  4. String label()

    13String label() {14    return nameAda + ":" + age35;15}
  5. System.out.println("person=" + person.label());

    24    System.out.println("person=" + person.label());25}
    outputperson=Ada:35