Класс определяется как его полностью определенным именем, так и загрузчиком классов, который его загрузил.
Это необходимо, потому что два класса одинаковы, только если они имеют одно и то же полное имя и были найдены вто же место (тот же загрузчик классов).
Если два класса имеют одинаковые имена и , они были загружены из разных загрузчиков классов, то нет гарантии, что они представляют один и тот же файл классов.
Если бы это было не так, это также представляло бы угрозу безопасности, поскольку вы могли бы подделать классы Java API.Вы можете создать свою собственную версию java.lang.String, загрузить ее с помощью другого загрузчика классов и получить привилегии других классов в java.lang (например, увидеть частные поля пакета).
ТамЕсть множество других преимуществ, связанных с уникальным идентификатором класса по имени и загрузчику классов.Хотя это выглядит немного странно, когда код генерирует исключение ClassCastException и классы имеют одинаковые имена.