关于java.lang.Module#addOpens(String, Module)真实场景应用及工作原理的问询
我对Java平台模块系统(JPMS)还算熟悉,但Module#addOpens的文档里描述了一个用例,我实在没法把它和真实场景对应起来:
此方法适用于以下场景:消费者模块通过限定
opens将某个包开放给API模块,但对消费者模块中类成员的反射访问权被委托给了另一个模块的代码。此时API模块中的代码可以调用此方法,将消费者模块的该包开放给这个其他模块。
我承认自己太笨了,没法从这段描述联想到实际怎么用。我能看出来这和扩展深层反射访问有关,但具体是怎么个扩展法,结合方法本身的描述就更懵了:
如果此模块(是不是指消费者模块?)已将某个包至少开放给调用者模块(是不是API模块?),则更新此模块,将该包开放给指定的模块(是不是其他模块?)。
我有个模糊但大概率错误的猜测:比如我的模块(假设是消费者模块)把某个包开放给Servlet(API模块),但运行时才发现实际用的Servlet实现是Tomcat。那是不是我可以调用这个方法,让Tomcat(其他模块)也能进行反射操作?这样我就不用在module-info里同时写opens com.foo.bar to Servlet和opens com.foo.bar to Tomcat了?
不过我也搞不懂这里的“委托”是怎么回事——在这个场景里Servlet总不能把什么东西委托给Tomcat吧?
再加上Lookup的调用点敏感性限制,我完全不知道这个方法该在什么时候、什么地方调用,也搞不懂明明已经加了opens声明,为什么还要用代码来做这件事。我理解这是为了在保证模块完整性的前提下,更灵活地授予反射权限,但就是没法把这些抽象描述落地成具体场景。
说白了就是:这个功能真的有实际用例吗?如果有的话,具体是什么场景?它到底是怎么工作的?
备注:内容来源于stack exchange,提问作者Laird Nelson

