【问题标题】:How do Java Module directives impact reflection access into a module?Java 模块指令如何影响对模块的反射访问?
【发布时间】:2018-12-26 04:20:30
【问题描述】:

根据https://www.oracle.com/corporate/features/understanding-java-9-modules.html,Java Module系统引入了以下指令:

  • 出口、出口……到
  • 用途
  • 提供...与
  • 打开,打开,打开...到

每个指令对使用反射访问内部成员的外部模块有什么(如果有)影响?

例如,exports <package> 是否允许外部模块使用反射访问导出包的所有 publicprotectedprivate 成员?其他指令呢?

【问题讨论】:

    标签: java reflection java-9 java-module module-info


    【解决方案1】:

    我会在这里简单地引用#JLS7.7(由我格式化和分类):

    区别于编译时访问和运行时访问,Java SE 平台通过核心反射 API 提供反射访问 (§1.4).

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

    普通模块

    普通模块仅授予反射对类型的访问权限 那些显式导出或显式打开的包(或 两个都)。

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

      对于普通模块之外的代码,反射访问被授予 模块的导出(未打开)包中的类型是 专门针对这些包中的publicprotected types,以及 这些类型的publicprotected 成员

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

      反射访问 授予模块打开的包中的类型(无论是导出的还是 not) 是这些包中的所有类型,以及这些包中的所有成员 类型

      在 未导出或打开的包

    • 在一个模块内

      模块内的代码 享受对所有类型及其所有成员的反思性访问 模块中的包。

    打开模块

    开放模块授予对所有类型的反射访问 包裹,好像所有包裹都已打开一样

    • 模块打开的包

      对于开放模块之外的代码,授予给 模块打开的包中的类型(即,模块中的所有包) module) 对那些包中的所有类型,以及这些包的所有成员 类型。

    • 在一个模块内

      代码在模块内享有对所有类型的反射访问, 及其所有成员,在模块中的所有包中

    【讨论】:

    • 除了这些uses 更多地涉及使用服务实现和provides 过度配置实现。
    • 优秀的答案。只有一个部分我不明白。对于opens X to Y,为什么文档说the code inside the module enjoys reflective access to [...] all packages in the module。访问不限于包X吗?
    • @Gili 当写成module A { opens X to B; } ... 在一个模块中,使用反射,所有包的类型/成员都可以访问。但是module B {requires A;} 只能访问package X 的所有类型/成员。
    猜你喜欢
    • 2016-04-08
    • 2016-12-24
    • 2011-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-08
    相关资源
    最近更新 更多