我熟悉 Java 平台模块系统。
javadoc概述Module#addOpens
了一个我无法转化为现实世界的用例:
此方法可用于以下情况:消费者模块使用限定打开将包打开到API 模块,但对消费者模块中类成员的反射访问委托给另一个模块中的代码。API 模块中的代码可以使用此方法将消费者模块中的包打开到其他模块。
我承认我太笨了,无法从这个描述跳到现实世界。我可以看到这与以某种方式扩展深度反射访问有关,但我不确定那种方式是什么,特别是考虑到方法描述本身:
如果此模块 [“消费者模块”?可能吗?] 至少已向调用者模块 [“ API 模块”?可能吗?] 打开了一个包,则更新此模块以向给定模块 [“其他模块”?可能吗?] 打开该包。
我有一种模糊的、几乎肯定是错误的感觉,这与我的模块(“消费者模块”?)打开一个包到 Servlet(“API 模块”?)之类的东西有关,但在运行时不知道 Servlet 的实现实际上是(比如说)Tomcat,所以,如果我的代码希望,它(我想?)可以调用这个方法,从而以某种方式允许 Tomcat(“其他”模块?)做反射的事情,而不知道它实际上是 Tomcat(而不是 Jetty)在做那些反射的事情,也不必有opens com.foo.bar to Tomcat
额外module-info
的opens com.foo.bar to Servlet
。
(我也不确定“委托”应该发生在哪里;在这种情况下,Servlet 不能将任何事情“委托”给 Tomcat。)
但考虑到Lookup
调用站点敏感度限制,我不确定这应该如何工作,或者在这种情况下我应该在代码中的何时何地进行此类调用,或者为什么如果我已经添加了opens
语句,我现在还必须执行一些编程操作。我理解完整性的激励目标,并且必须授予反射访问的权限,并且这应该以某种方式使事情变得更容易,但我无法具体实现这一点。
简而言之:这个功能实际上有具体的用例吗?如果有,它是什么?它是如何工作的?