Во-первых, общая часть Class<?>
здесь на самом деле не имеет значения. Конечно, нет необработанных типов, поэтому Class<?>
лучше, чем Class, но для вашего вопроса подстановочный знак не имеет значения.
Итак, по сути, вы спрашиваете, являются ли объекты класса неизменными. И для всех практических целей они есть.
Объекты класса появляются, когда загрузчик классов загружает класс, и они остаются на месте, если не загружен весь загрузчик классов и все, что он загружает вместе с ним.
Что не может произойти, если такие объекты класса еще где-то используются на карте.
С другой стороны: Class.forName()
не должен быть слишком дорогим для уже загруженных классов. И когда в игру вступают такие вещи, как сериализация, люди, например, предлагают использовать String вместо объектов Class (см. здесь ).
Необходимо различать неизменную идентичность объекта класса и фактический "код", принадлежащий классу. Этот код можно изменить во время выполнения (используя инструментарий, подумайте горячая замена кода). Но это не должно влиять на имя класса, каждый его код и равенство equals()
. Потому что «идентичность» остается прежней.
Заключительное примечание: по мере того, как выкладываются интересные комментарии, существуют определенные способы изменения объектов класса в определенной степени. Но все эти действия определенно "вне нормы". Поэтому: теоретически вы можете предпочесть Strings объектам Class, но практически, в «обычных» приложениях, использование Class тоже должно работать нормально.