【发布时间】:2017-05-17 12:32:46
【问题描述】:
我正在阅读 Java 9 规范的草案,但我不清楚这句话:
opens 指令指定当前模块要打开的包的名称。这使得包中的公共和受保护类型,以及它们的公共和受保护成员,只能在运行时被其他模块中的代码访问。它还使包中的所有类型及其所有成员都可以通过 Java SE 平台的反射库进行访问。
如果 opens 使 public 和 protected 仅在运行时可访问,那么包区域中的所有类型都可以通过反射访问意味着什么?
我不明白运行时和反射之间的区别。
似乎打开的包只能在运行时访问并受保护(通过反射?),以及其他未指定类型和成员的包可访问 vie 反射(也是私有的......)。
【问题讨论】:
-
我不知道我是否正确理解了您的问题,但请考虑到有人可能拥有依赖于包中公共 API 的代码。然后 Java 9 出来了,包被封装在一个模块中。您需要打开模块才能继续使用该遗留代码。
-
我再次尝试解释一下:如果 open 允许一个包的所有类型和所有成员进行反射访问,为什么还要解释一个 public 和 protected case?
-
好的,谢谢。就像我说的那样,可能有人在封装包之前使用了这些 API(正常方式,而不是通过反射)。这似乎是一个向后兼容的功能。
-
请问如何在运行时访问 API(公共和受保护)而不进行反射? (在编译时无法访问打开的包......)。也许公共和受保护将通过正常反射访问,而私有通过深度反射访问?