平台模块之间是否允许循环?

这是java.rmi模块的模块声明:

 module java.rmi { requires java.base; requires java.logging; exports java.rmi.activation; exports com.sun.rmi.rmid to java.base; // <-- cycle ... } 

所以, java.rmijava.base之间存在循环依赖,对吗? 平台模块之间是否允许循环?

模块系统禁止使用requires子句静态声明循环。 这适用于平台和应用程序模块,您提供的示例不违反该规则。

但是,要求子句只是模块图中可读性边缘的一个来源。 其他是命令行标志,reflection, requires transitive ,我相信还有更多。 添加所有这些可能会导致模块图中的循环,并且不会被禁止。

在您的具体示例中,只有在java.base读取java.rmi时才会创建循环,如果它在com.sun.rmi.rmid对类使用reflection,则可能会发生这种情况。