Введение в рефлексию в Java
Иногда код должен спросить у уже описанного типа, как он
называется и из чего состоит, ещё до работы с конкретным
экземпляром. На JVM такие сведения лежат в собранном
class-файле; в Java к ним обращаются через пакет
java.lang.reflect и тип Class.
Рефлексия - способ читать эти метаданные из работающей программы: перечислить поля, найти метод, вызвать конструктор или прочитать пометку на классе.
У каждого типа есть литерал ИмяТипа.class. Выражение
не создаёт объект - оно возвращает описание класса,
с которым дальше работают как с обычным значением:
class Parcel {
private final int id;
Parcel(int id) {
this.id = id;
}
}
public class Main {
public static void main(String[] args) {
Class<?> kind = Parcel.class;
System.out.println(kind);
}
}
Печать такого значения даёт служебную строку с полным
именем на JVM. Для человека удобнее метод
getSimpleName - короткое имя без пакета:
class Parcel {
private final int id;
Parcel(int id) {
this.id = id;
}
}
public class Main {
public static void main(String[] args) {
Class<?> kind = Parcel.class;
System.out.println(kind.getSimpleName());
}
}
Тот же приём работает и для встроенных типов: достаточно
написать String.class или int.class
в любом месте программы. Так проверяют, с каким классом
столкнулся код, не завязываясь на конкретный экземпляр.
Одной ссылки на класс хватает, чтобы понять идею темы:
программа читает описание типа изнутри, ещё до работы
с объектом в памяти. В следующих уроках разберём другие
способы получить Class, списки членов класса,
создание объектов и вызовы по ссылке.