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

Gil*_*ili 6 java reflection java-9 java-module module-info

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

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

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

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

Nam*_*man 5

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

\n\n
\n

与编译时访问和运行时访问不同,Java\n SE 平台通过核心反射 API\n (\xc2\xa71.4)提供反射访问。

\n
\n\n

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

\n\n

普通模块

\n\n
\n

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

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

    \n\n
    \n

    对于普通模块外部的代码,授予模块导出(且未打开)包中的类型的反射访问权限专门针对这些包中的publicprotected类型,以及这些中的和成员类型。publicprotected

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

    \n\n
    \n

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

    \n\n

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

    \n
  • \n
  • 在一个模块内

    \n\n
    \n

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

    \n
  • \n
\n\n

开放模块

\n\n
\n

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

\n
\n\n
    \n
  • 模块打开的包

    \n\n
    \n

    对于开放模块外部的代码,授予模块打开的包(即模块中的所有包)中的\n 类型的反射访问权限是针对这些包中的所有类型以及这些\n 的所有成员\n类型

    \n
  • \n
  • 在一个模块内

    \n\n
    \n

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

    \n
  • \n
\n