Загрузка классов и ресурсов в Java 9

Я читал эта статья на InfoQ цитирую Рейнгольд:

разработчики все еще могут использовать путь класса Java в Java 9 для Java runtime для поиска классов и файлов ресурсов. Просто ... Модули Java 9, разработчикам больше не нужен путь к классу.

Итак, теперь мой вопрос: каков правильный способ Java 9 для выполнения задач, перечисленных выше? Как вы динамически загружаете, например, изображение (за исключением возни с относительным пути)?

еще более интересно, Как проверить, доступен ли класс и принять решение динамически (например, проверить, доступен ли Джексон, и если да, то использовать его для сериализации JSON, а если нет, то использовать что-то еще)?

в статье также упоминается Spring Boot, уже поддерживающий Java 9, и Spring Boot определенно делает много динамической загрузки. Так, может быть, кто-то знает priece кода от Spring, на который я могу посмотреть?

2 ответов


во-первых, чтобы установить рекорд прямо, я ни сказал, ни написал текст цитировавшийся выше. Я бы никогда так не сказал. Это просто небрежно. отчетность со стороны соответствующих изданий.

самое главное, чтобы понять о загрузке класса и ресурса поиск в Java 9, что на фундаментальном уровне, они не изменились. Вы можете искать классы и ресурсы так же, как всегда имейте, призывая Class::forName и различных getResource* методы в the Class и ClassLoader классов, независимо от того, является ли ваш код загружается из пути к классу или пути к модулю. Есть еще три встроенные загрузчики класса, как и в JDK 1.2, и у них есть те же отношения делегирования. Много существующего кода, поэтому просто работами, из-из-коробки.

есть некоторые нюансы, как отмечается в JEP 261: конкретный тип из встроенного класса загрузчики изменились, а некоторые классы ранее загружается bootstrap загрузчик класса загружает класса платформы погрузчик для повышения безопасности. Существующий код, который предполагает, что встроенный загрузчик классов-это URLClassLoader, или, что класс загружается поэтому загрузчик класса bootstrap может потребовать незначительных корректировок.

последним важным отличием является то, что неклассовые файловые ресурсы в модуле инкапсулируются по умолчанию, а значит не может быть расположен снаружи модуль если их эффективный пакет open. К загрузка ресурсов из собственного модуля лучше всего использовать методы поиска ресурсов в Class или Module, который может найти любой ресурсе в вашем модуле, а не в ClassLoader, который может только найдите неклассовые файловые ресурсы в open пакеты модуля.


[Edit: этот ответ был написан до авторитетного ответа Марка. Я пересмотрел мой, чтобы предоставить простой пример, доступный на GitHub.]

Per видео, загрузка класса в Java 9 не изменилась.

в качестве примера предположим, что у нас есть:

  • an example.jar, который содержит изображение в пакет net.codetojoy.example.resources
  • усилить ЕАО, net.codetojoy.example.Composer является общедоступным (и экспортируется, где применимо)
  • простой App класс, который использует example.jar в качестве библиотеки и пытается загрузить изображение из него

соответствующий код в App:

static InputStream getResourceAsStream(String resource) 
    throws Exception {

    // Load net/codetojoy/example/resource/image.jpg
    // Assume net.codetojoy.example.Composer is public/exported
    // resource is 'resource/image.jpg'

    InputStream result = Composer.class.getResourceAsStream(resource);

    return result;
}   

вот несколько случаев для example.jar в JDK 9:

Старомодная, Немодульная Банка

если example.jar не является модулем, код просто работает. Загрузка класса не изменилась.

Модульная Jar С Открытым Пакет

в этом случае это :

module net.codetojoy.example {
    // export the Composer class
    exports net.codetojoy.example;

    // image is available
    opens net.codetojoy.example.resources;
}

в этом случае изображение может быть загружено клиентом, так как пакет открыт.

Модульная Банка Без Открытой Упаковки

в этом случае module-info.java - это:

module net.codetojoy.example {
    // export the Composer class
    exports net.codetojoy.example;

    // package not opened: image not available
    // opens net.codetojoy.example.resources;
}

в этом случае изображение не может быть загружено из-за сильной инкапсуляции: модуль защищает изображение, не открывая пакет.

полный источник здесь на GitHub.