加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

如何为未命名的模块获取Java 9 ModuleReference

发布时间:2020-12-15 01:08:43 所属栏目:Java 来源:网络整理
导读:参见英文答案 Scanning classpath/modulepath in runtime in Java 9????????????????????????????????????2个 更新:我在这里回答了我自己的问题: Scanning classpath/modulepath in runtime in Java 9 [旧问题 已过时:] 在Java 9中仅给出Module对象的Modu

参见英文答案 > Scanning classpath/modulepath in runtime in Java 9????????????????????????????????????2个
更新:我在这里回答了我自己的问题:

Scanning classpath/modulepath in runtime in Java 9

[旧问题 – 已过时:]

在Java 9中仅给出Module对象的ModuleReference的正确方法是什么?

考虑这两个引用java.base的方法:

Module mod = ModuleLayer.boot().findModule("java.base").orElse(null);
ModuleReference modRef = ModuleFinder.ofSystem().find("java.base").orElse(null);

mod有一个方法Set< String> getPackages(),但是只获取包的名称,不能列出每个包中的资源.

modRef有一个方法ModuleReader open(),而ModuleReader有一个方法Stream< String> list()列出了模块中的资源,这是我需要做的.

但是,对于通过向类路径添加非模块jar文件而生成的自动(因而未命名)模块,您无法从ModuleFinder.ofSystem()获取ModuleReference.find(String name)或ModuleFinder.ofSystem().findAll() – – 您只能从getClass().getModule()获取Module引用.

我找不到任何方法来获取自动模块的ModuleReference.我也找不到从Module对象获取ModuleReference的方法,这意味着如果模块是自动和/或未命名的,我无法列出模块中的资源.

当然必须有一种方法来获取给定(已加载)模块的ModuleReference?

最佳答案
从问题中清除的第一件事是句子中的推断是不正确的 –

for automatic (and therefore unnamed) modules,produced by adding non-module jar files to the classpath

Automatic modules是在模块路径上找到的命名模块.另一方面,the unnamed module是模块系统的成员,该系统支持从类路径加载类型,该类路径的包未在任何已知(命名)模块中定义.

用于加载类型本身的ClassLoader可用于获取Module(未命名).我也试过在How many unnamed modules are created in Java 9?的答案中解释这一点.要链接到precise documentation,还要回答哪个类加载器是未命名的模块?

Every class loader,it turns out,has its own unique unnamed module,
which is returned by the new 07004 method….

ClassLoader cl = getClass().getClassLoader();// returns the class loader for the class
Module yourClassLoaderUnnamedModule = cl.getUnnamedModule();

进一步移动文档增加了获取一个类型的模块加载形式未命名的模块::

.. type is considered to be in that loader’s unnamed module,i.e.,
the 07005 method of the type’s Class object will return its
loader’s unnamed module.

最终相当于:

Module yourClassUnnamedModule = getClass().getModule(); // from the type itself

主要是在访问未命名模块的资源方面,虽然我同意目前没有API可以访问未命名模块的资源等.但是,由于通过此模块加载的Class对象的类型总是来自类路径,因此可以要么获取正在使用的类路径的所有资源,要么相反,您可以检查是否从类路径或模块路径访问正在使用的资源.我能想到的一种方法是使用上述两个功能进行验证:

yourClassLoaderUnnamedModule.equals(yourClassUnnamedModule)//true if resource is loaded via classpath

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读