Java 9 之后加载类和资源

2024-02-13

我正在读书InfoQ 上的这篇文章 https://www.infoq.com/news/2017/06/oracle-defends-jpms引用莱因霍尔德的话:

开发人员仍然可以使用 Java 9 中的 Java 类路径来实现 Java 运行时搜索类和资源文件。只是这样与 Java 9的模块,开发者不再需要类路径。

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

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

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


首先,澄清一下,我既没有说过也没有写过这段文字 上面引用了。我绝不会这么说。这只是马虎而已 对所涉及出版物的部分进行报道。

关于类加载和资源,最重要的是要理解 Java 9 中的查找在根本上没有改变。 您可以像平常一样搜索课程和资源 有,通过调用Class::forName以及各种getResource*方法 在里面Class and ClassLoader类,无论您的代码是否 从类路径或模块路径加载。还有三个 内置类加载器,就像 JDK 1.2 中一样,并且它们具有 相同的委托关系。因此,许多现有代码只是 有效,开箱即用。

有一些细微差别,如中所述JEP 261 http://openjdk.java.net/jeps/261#Class-loaders:具体类型 内置类加载器的数量已更改,某些类以前已更改 由引导类加载器加载的现在由平台类加载 加载器以提高安全性。现有代码假设 内置类加载器是URLClassLoader,或者一个类被加载 因此,引导类加载器可能需要进行细微调整。

最后一个重要的区别是模块中的非类文件资源 默认情况下是封装的,因此无法从外部找到 模块,除非其有效包是open https://docs.oracle.com/javase/9/docs/api/java/lang/Module.html#getResourceAsStream-java.lang.String-。 要从您自己的模块加载资源,最好使用 资源查找方法Class or Module,它可以定位任意 您模块中的资源,而不是ClassLoader, 哪个行 只定位非类文件资源open模块的包。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 9 之后加载类和资源 的相关文章

随机推荐