一尘不染

在Java 9中加载类和资源

spring-boot

我正在阅读有关InfoQ的文章
Reinhold:

对于Java运行时,开发人员仍可以使用Java 9中的Java类路径来搜索类和资源文件。只是有了Java 9的模块,开发人员就不再需要类路径。

所以现在我的问题是:执行上述任务的正确的Java 9方法是什么?您如何动态加载例如图像(缺少相对路径)?

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

本文还提到了Spring Boot已经支持Java 9,并且Spring
Boot确实做了很多动态加载。因此,也许有人知道我可以看到的Spring丰富的代码?


阅读 330

收藏
2020-05-30

共1个答案

一尘不染

首先,为澄清起见,我既没有说也没有写上面引用的文字。我永远不会那样说。那只是有关出版物的草率报道。

关于Java
9中的类加载和资源查找,最重要的要了解的是,从根本上讲,它们没有改变。您可以通过调用Class::forName和类中的各种getResource*方法,以Class与以往相同的方式搜索类和资源ClassLoader,而不管代码是从类路径还是模块路径中加载的。与JDK
1.2中一样,仍然有三个内置的类加载器,它们具有相同的委托关系。因此,许多现成的代码都是开箱即用的。

JEP 261中所述,有一些细微差别:内置类加载器的具体类型已更改,并且以前由引导类加载器加载的某些类现在由平台类加载器加载,以提高安全性。因此,假定内置类加载器为URLClassLoader或由引导类加载器加载类的现有代码,可能需要进行少量调整。

最后一个重要的区别是模块中的非类文件资源默认情况下是封装的,因此除非它们的有效包为,否则无法从模块外部找到它们
open
。从您自己的模块加载资源,最好使用在资源查找方法Class或者Module,它可以找到任何资源的模块中,而不是那些ClassLoader,只能在找到非类文件的资源open模块的封装。

2020-05-30