根据https://www.oracle.com/corporate/features/understanding-java-9-modules.html,Java Module 系统引入了以下指令:
- 出口,出口……到
- 用途
- 提供...与
- 打开,打开,打开……到
每个指令对使用反射访问内部成员的外部模块有什么(如果有)影响?
例如,是否exports <package>
允许外部模块使用反射访问导出包的所有public
成员?其他指令呢?protected
private
根据https://www.oracle.com/corporate/features/understanding-java-9-modules.html,Java Module 系统引入了以下指令:
每个指令对使用反射访问内部成员的外部模块有什么(如果有)影响?
例如,是否exports <package>
允许外部模块使用反射访问导出包的所有public
成员?其他指令呢?protected
private
我会在这里简单地引用#JLS7.7(由我格式化和分类):
与编译时访问和运行时访问不同,Java SE 平台通过核心反射 API (§1.4)提供反射访问。
更多关于您的问题归类为普通模块(module foo
)和开放模块(open module bar
):
普通模块仅授予对显式导出或显式打开(或两者)的包中的类型的反射访问权限。
模块的导出包 ( exports com.example.foo.bar
)
对于普通模块之外的代码,授予模块导出(和未打开)包中的类型的反射访问权限专门针对这些包中的 and 类型,以及
public
这些类型的and成员。protected
public
protected
模块打开的包 ( opens com.example.foo.internal to com.example.bar
)
授予模块打开包中的类型(无论是否导出)的反射访问权限是对这些包中的所有类型以及这些类型的所有成员。
未向未导出或打开的包中的类型或其成员授予反射访问权限。
在一个模块内
模块中的代码 可以反射访问模块中所有包中的所有类型及其所有成员。
开放模块授予对其所有包中的类型的反射访问权限,就好像所有包都已打开一样。
模块打开的包
对于打开模块之外的代码,授予模块打开包中的类型(即模块中的所有包)的反射访问权限是对这些包中的所有类型以及这些类型的所有成员。
在一个模块内
模块内的代码可以反射访问模块中所有包中的所有类型及其所有成员。