Загрузка классов и ресурсов в 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.