最近我发现,如果模块内的包包含公共接口或类,它们会自动导出,因此在接收者代码未模块化时无意中在模块外部可见。
项目结构如下
parent
sub-donor (java-module)
my/project/first
Cowboy.java
module-info.java
sub-recipient (has no module-info)
my/project/somewhere
Main.java
模块信息.java
module my.donor {
// nothing is exported here
}
牛仔.java
public class Cowboy {
public String say() { return "eee-ha"; }
}
主.java
import my.project.first.Cowboy;
public class Main {
public static void main(String[] args) {
Cowboy g = new Cowboy();
System.out.println(g.say());
}
}
包中的类my.project.first
应该my.donor
只在模块中使用,并且在模块之外是不可见的。
没想到它在模块外可见,好像有一行,所以可以编译exports my.project.first;
该类。Main
限制可见性的方法是制作sub-recipient
一个 java 模块,添加module-info.java
,然后其中的所有内容都sub-donor
按预期隐藏。当然,对于任何其他非模块化项目,my.donor
模块中的每个公共类都是可见的。
请在 GitHub 上查看一个最小的工作示例。
我很好奇这是一个错误还是一个有意识的设计。这种方法的目的是什么?