все еще встроен в виртуальную машину Java и представлен нулем в ClassLoader API. Он определяет классы в нескольких критических модулях, таких как java.base. В результате он определяет гораздо меньше классов, чем в JDK 8, поэтому приложениям, которые развертываются с -Xbootclasspath / a или которые создают загрузчики классов с нулевым значением в качестве родительского, может потребоваться изменить, как описано ранее.

ая с Java-8, я знаю, что иерархия загрузчиков классов была следующей:

Загрузчик классов загрузчика -> Расширение загрузчика классов -> Приложение загрузчик классов

Каково изменение в иерархии загрузчиков классов в Java 9 и как это работает?

Ответы на вопрос(2)

руководство по миграции для Java 9,

Новые реализации загрузчика классов

JDK 9 поддерживает иерархию загрузчиков классов, существовавшую с версии 1.2, Однако для реализации системы модулей были сделаны следующие изменения:

загрузчик классов приложений являетсябольше не экземпляр URLClassLoader но, скорее, внутреннего класса. Это загрузчик по умолчанию для классов в модулях, которые не являются ни модулями Java SE, ни JDK.

загрузчик классов расширения былпереименованный; сейчасзагрузчик класса платформы, Все классы в платформе Java SE гарантированно будут видны через загрузчик классов платформы. Кроме того, классы в модулях, которые стандартизированы в рамках процесса сообщества Java, но не являются частью платформы Java SE, гарантированно будут видны через загрузчик классов платформы.

Тот факт, что класс виден через загрузчик классов платформы, не означает, что класс фактически определяется загрузчиком классов платформы. Некоторые классы в платформе Java SE определяются загрузчиком классов платформы, в то время как другие определяются загрузчиком классов начальной загрузки. Приложения не должны зависеть от того, какой загрузчик классов определяет какой класс платформы.

Изменения в JDK 9 могут повлиять на код, который создает загрузчики классов с нулем (то есть загрузчиком классов начальной загрузки) в качестве загрузчика родительского класса и предполагает, что все классы платформы видны для родителя. Такой код может потребоваться изменить, чтобы использовать загрузчик класса платформы в качестве родителя (см. ClassLoader.getPlatformClassLoader).

загрузчик класса платформы не является экземпляром URLClassLoader, но, скорее, внутреннего класса.

загрузчик класса начальной загрузки все еще встроен в виртуальную машину Java и представлен нулем в ClassLoader API. Он определяет классы в нескольких критических модулях, таких как java.base. В результате он определяет гораздо меньше классов, чем в JDK 8, поэтому приложениям, которые развертываются с -Xbootclasspath / a или которые создают загрузчики классов с нулевым значением в качестве родительского, может потребоваться изменить, как описано ранее.

Решение Вопроса

ClassLoader в пересмотренной версии Java-9 говорится, что:

Во время выполнения Java есть следующие встроенные загрузчики классов:

Bootstrap class loader: Встроенный загрузчик классов виртуальной машины обычно представлен как ноль, и не имеет родителя.

Platform class loader: Чтобы разрешить обновление / переопределение модулей, определенных для загрузчика классов платформы, и когда обновленные модули считывают модули, определенные для загрузчиков классов, отличных от загрузчика класса платформы и его предков, загрузчик класса платформы, возможно, должен будет делегировать другим загрузчикам классов, загрузчик класса приложения, например.Другими словами, классы в именованных модулях, определенных для загрузчиков классов, отличных от загрузчика классов платформы и его предков, могут быть видны загрузчику классов платформы.

System class loader: Этотакже известный как загрузчик классов приложений и отличается от загрузчика класса платформы. Загрузчик системного класса обычно используется дляопределить классы на пути к классам приложения, на модуле и на инструментах, специфичных для JDK, Загрузчик класса платформы является родителем или предком загрузчика системного класса, который виден всем классам платформы.

Ваш ответ на вопрос