Давайте внимательно посмотрим на эту строку:
System.out.println(a.getClass().getField("b").getType());
Сначала возьмем переменную a
.Это некоторый анонимный подкласс объекта.Давайте назовем этот класс MyClass$1
.Хорошо, пока все хорошо.
Далее вы вызываете метод getClass ().Он возвращает класс a, то есть описание класса MyClass$1
.Это описание не привязано к какому-либо конкретному экземпляру этого класса.Класс одинаков для всех экземпляров, будь то a
или что-то еще (если не используются разные загрузчики классов).В этом конкретном случае, однако, может быть только один экземпляр, поскольку класс является анонимным, но механизм все тот же.
Теперь из класса вы получаете поле b
.Поскольку класс не связан напрямую ни с одним из этих экземпляров, поле также не имеет ничего общего с a
.Это просто описание того, что представляет собой поле a
класса MyClass$1
.
Теперь вы получите его тип.Но поскольку он не привязан ни к какому экземпляру, он не может знать тип среды выполнения.На самом деле, если класс не был анонимным, у вас может быть множество экземпляров MyClass$1
, каждый из которых имеет различное значение в a
.Или у вас не может быть никаких экземпляров вообще.Таким образом, единственная вещь, которую getType () может вам сказать, это объявленный тип b
, что именно и делает.Поле b
на самом деле может быть null
в этот момент, и вы все равно получите Object
в качестве результата.
Класс Field предоставляет метод get () для фактического доступа к этому конкретному полюнекоторого объекта, такого как:
System.out.println(a.getClass().getField("b").get(a).getClass());
Теперь вы получаете что-то вроде MyClass$1$1
, который является именем анонимного класса объекта, на который ссылается поле b
, в a
экземпляр .