java - 在 Java 9 中加载类和资源

标签 java spring-boot java-9 java-platform-module-system module-path

我正在阅读 this article on InfoQ引用莱因霍尔德:

Developers can still use the Java class path in Java 9 for the Java runtime to search for classes and resource files. It's just that with Java 9's modules, developers no longer need the class path.

所以现在我的问题是:执行上述任务的正确 Java 9 方法是什么?你如何动态加载例如一张图片(没有摆弄相对路径)?

更有趣的是,如何检查一个类是否可用并动态做出决定(例如,检查 Jackson 是否可用,如果可用,将其用于 JSON 序列化,如果不使用其他东西)?

文章还提到 Spring Boot 已经支持 Java 9,而且 Spring Boot 肯定做了很多动态加载。那么也许有人知道我可以查看的 Spring 代码价格?

最佳答案

首先,为了澄清事实,我既没有说也没有写文字 以上引用。我永远不会那样说的。这只是草率 报告所涉及的出版物。

关于类加载和资源的最重要的理解 Java 9 中的查找是,从根本上说,它们没有改变。 您可以像往常一样搜索类(class)和资源 有,通过调用 Class::forName 和各种 getResource* 方法 在 ClassClassLoader 类中,不管你的代码是否 从类路径或模块路径加载。还是三个 内置类加载器,就像在 JDK 1.2 中一样,它们有 相同的委托(delegate)关系。因此,许多现有代码只是 开箱即用。

有一些细微差别,如 JEP 261 中所述: 具体类型 的内置类加载器已经改变,一些类以前 由引导类加载器加载的现在由平台类加载 加载程序以提高安全性。现有代码假定一个 内置类加载器是一个 URLClassLoader,或者一个类是由 引导类加载器,因此可能需要稍作调整。

最后一个重要的区别是模块中的非类文件资源 默认封装,因此 cannot be located from outside the module unless their effective package is open . 要从您自己的模块加载资源,最好使用 ClassModule 中的资源查找方法,可以定位任何 模块中的资源,而不是 ClassLoader 中的资源,它可以 仅在模块的 open 包中定位非类文件资源。

关于java - 在 Java 9 中加载类和资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45166757/

相关文章:

java - JSF标签中的Unicode显示问题

java - Spring DAO Repository 异常处理

spring-boot - 在IntelliJ IDE中找不到Maven插件

java - List.of(...) 或 Collections.unmodifiableList()

java - Spring Boot 和 Spring Batch 在 ItemProcessor 批处理的 DAO 中抛出 NullPointerException

java - libGDX - while 循环是否会导致挂起

java - 无法 Autowiring 。找不到 `Repository' 类型的 bean

java - 如果方法参数是接口(interface),如何制作缓存键

java - 运行 java 8 和 9 的 mac 应用程序

java - 无法使用 Tycho 和 Java 9 构建 Eclipse RCP 项目