Reflecting Types

To obtain a TypeDefinition object, you can do the following:

class Car {}

TypeDefinition<Car> carType = mirror.reflect(Car.class);
String name = carType.getName()

assert name.equals("Car");

Fields

class Car {
    int fuel;
    Car(int fuel) { ... }
}

Car car = new Car(100);
Field<Car, Integer> fuelField = (Method<Car, Integer>) carType.getFields()
        .stream()
        .filter((m) -> m.getName().equals("fuel"))
        .findAny()
        .orElseThrow();
fuelField.set(car, 10);
int fuel = fuelField.get();

assert fuel == 10;
assert car.fuel == 10;

Constructors

class Car {
    int fuel;
    Car(int fuel) { ... }
}

Constructor<Car> constructor = carType.getConstructors()
        .stream()
        .findAny()
        .orElseThrow();
Car car = constructor.construct(100);

assert car.fuel == 100;

Methods

class Car {
    int fuel;
    Car(int fuel) { ... }
    int getFuel() { ... }
}

Car car = new Car(100);
Method<Car, Integer> method = (Method<Car, Integer>) carType.getMethods()
        .stream()
        .filter((m) -> m.getName().equals("getFuel"))
        .findAny()
        .orElseThrow();
int fuel = method.invoke(car);

assert fuel == 100;

Last updated