Java模块指令如何影响对模块的反射访问?

5
根据https://www.oracle.com/corporate/features/understanding-java-9-modules.html,Java模块系统引入了以下指令:
  • exports,exports ... to
  • uses
  • provides ... with
  • open,opens,opens ... to
每个指令对使用反射访问内部成员的外部模块有什么影响(如果有)?
例如,exports <package>是否允许外部模块使用反射访问导出包的所有publicprotectedprivate成员?其他指令呢?
1个回答

5
我只需引用#JLS7.7(由我格式化和分类):

与编译时访问和运行时访问不同,Java SE平台通过核心反射API提供了反射访问 (§1.4)

更多关于您的问题的分类,如普通模块(module foo)和开放模块(open module bar):

普通模块

一个普通模块仅授予反射访问权以显式导出或显式打开的包中的类型(或两者兼备)。

  • 模块的导出包(exports com.example.foo.bar

    对于位于普通模块外部的代码,授予反射访问权限以访问模块导出(但未打开)的包中的类型,特别是这些包中的publicprotected类型,以及这些类型的publicprotected成员。

  • 模块的打开包(opens com.example.foo.internal to com.example.bar

    授予对模块打开包中的类型(无论是否导出)的访问权限是对这些包中所有类型及其所有成员的访问权限。

    不授予未导出或未打开的包中的类型或其成员的反射访问权限

  • 在模块内部

    模块内的代码可以反射地访问模块中所有包中的所有类型及其所有成员

开放模块

开放模块授予反射访问权以访问其所有包中的类型,就像所有包都已打开一样

  • 模块的打开包

    对于在未打开模块外的代码,赋予反射访问权限以获取模块中所有包(即模块中的所有包)中类型的访问权,可以访问这些包中的所有类型及其所有成员

  • 在模块内部

    在模块内部的代码可以反射地访问模块中所有包中的所有类型及其成员


1
除了这些,uses更多地涉及消耗服务实现,而provides则涉及提供一种实现。 - Naman
优秀的答案。只有一个部分我不理解。opens X to Y 这个声明为什么在文档中说 模块内的代码具有反射访问权限[...]对于模块中的所有包。访问权限不应该只限于包 X 吗? - Gili
1
@Gili 当写成 module A { opens X to B; } 时... 在一个模块内,使用反射,所有包的类型/成员都是可访问的。但是 module B {requires A;} 只能访问 package X 中的所有类型/成员。 - Naman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接