我正在阅读有关InfoQ的文章 Reinhold:
对于Java运行时,开发人员仍可以使用Java 9中的Java类路径来搜索类和资源文件。只是有了Java 9的模块,开发人员就不再需要类路径。
所以现在我的问题是:执行上述任务的正确的Java 9方法是什么?您如何动态加载例如图像(缺少相对路径)?
更有趣的是,如何检查一个类是否可用并动态地做出决定(例如,检查Jackson是否可用,如果可用,则将其用于JSON序列化,如果不使用其他功能)?
本文还提到了Spring Boot已经支持Java 9,并且Spring Boot确实做了很多动态加载。因此,也许有人知道我可以看到的Spring丰富的代码?
首先,为澄清起见,我既没有说也没有写上面引用的文字。我永远不会那样说。那只是有关出版物的草率报道。
关于Java 9中的类加载和资源查找,最重要的要了解的是,从根本上讲,它们没有改变。您可以通过调用Class::forName和类中的各种getResource*方法,以Class与以往相同的方式搜索类和资源ClassLoader,而不管代码是从类路径还是模块路径中加载的。与JDK 1.2中一样,仍然有三个内置的类加载器,它们具有相同的委托关系。因此,许多现成的代码都是开箱即用的。
Class::forName
getResource*
Class
ClassLoader
如JEP 261中所述,有一些细微差别:内置类加载器的具体类型已更改,并且以前由引导类加载器加载的某些类现在由平台类加载器加载,以提高安全性。因此,假定内置类加载器为URLClassLoader或由引导类加载器加载类的现有代码,可能需要进行少量调整。
URLClassLoader
最后一个重要的区别是模块中的非类文件资源默认情况下是封装的,因此除非它们的有效包为,否则无法从模块外部找到它们 open。从您自己的模块加载资源,最好使用在资源查找方法Class或者Module,它可以找到任何资源的模块中,而不是那些ClassLoader,只能在找到非类文件的资源open模块的封装。
open
Module