Во-первых, существуют ограничения такого типа для принудительного применения песочницы Java.То есть запуск ненадежного кода в доверенной среде.Например, запуск апплета с какого-либо сайта (которому вы не обязательно доверяете) на вашем компьютере (в доверенной среде) в вашем браузере.Намерение состоит в том, чтобы запретить недоверенному коду получать доступ к частным данным пакета, которые могли бы помочь ему избежать «песочницы».
Обычно эти ограничения применяются SecurityManager, поэтому они не должны возникать, когда вы запускаете свое собственное приложение.в командной строке (если вы явно не укажете использовать SecurityManager).Когда вы управляете средой, вы можете просто перейти и отредактировать определение String.class внутри rt.jar вашего Java (и вы можете, во всяком случае, технически не знать, что говорит лицензирование).Как я уже сказал, ограничения обычно в SecurityManager, но это конкретное правило о пакетах java. * Находится в классе ClassLoader.
Чтобы ответить на ваш вопрос: я предполагаю, что проверка java. * Существует из-за) исторические причины б) где-то в ядре Java есть проверка имени класса, что-то вроде: все классы, начинающиеся с java. * получают специальную обработку.
Однако учтите, что даже если вам удалосьсоздайте класс с именем java.lang.String, это не будет тот же класс, что и java.lang.String, определенный ядром Java.Это был бы просто класс с точно таким же именем.Идентификация класса - это больше, чем просто имя класса, хотя это может быть сложно воспринимать, если вы действительно не играете с ClassLoaders.
Так что класс, загруженный загрузчиком классов приложения в пакете java.lang, не будетиметь доступ к основному пакету java.lang.
Чтобы проиллюстрировать это, попробуйте создать класс с именем javax.swing.JButton с помощью метода main и выполнить его.Вы получите java.lang.NoSuchMethodError: main
.Это потому, что java находит «настоящий» JButton перед вашим классом, а настоящий JButton не имеет основного метода.
В автономном приложении Java вы можете обойти это ограничение, вызвав один изчастные нативные методы defineClassx напрямую с использованием отражений и setAccessible.
Кстати: ядро java.lang.String гарантированно будет загружено до того, как ваш код когда-либо выполнится, потому что на него ссылаются везде, вы не получите его первым с помощьюкод пользователя.JVM настроен до такой степени, что даже не пытался загрузить ваш класс, не говоря уже о его выполнении.