Class<T>
представляют runtime-описание типов. В терминах этого описания перечисления считаются классами, аннотации – интерфейсами. В основном приходится взаимодействовать с метаклассами при работе с рефлексией или загрузчиками. По большей части эти экземпляры класса
Class
состоят из содержимого .class-файла. Создаются они только внутри класслоадера. Особенности их хранения в памяти обсуждаются в предыдущем посте.Вторая тема для разговора здесь – особенности класса Class для примитивов, массивов и void. Для получения таких экземпляров используется тот же синтаксис, что и для обычных классов:
void.class
, int.class
, float[][].class
. Конструкция foo.class
– это не обращение к члену, а литерал класса. Для
void
типом-параметром T
выступает специальный неинстанциируемый тип java.lang.Void
. Тип-параметр примитива – соответствующий класс-враппер. Хотя для самого класса-враппера будет отдельный экземпляр Class
. То есть int.class != Integer.class
. Метод
getClassLoader
обычного класса или интерфейса вернет загрузчик, который его загрузил. null
может вернуться для загруженного bootstrap-класслоадером типа. Для массива возвращается то же, что для типа его элементов. Для примитивов и void
результатом всегда будет null
.