我正在编写一个分为包的Java程序。如何授予其中定义的范围内的类及其子范围的权限。
例如,我有 3 个包 app.A、app.A.Sub、app.B。在packge AI中有类GlobalA。
我希望只有包 app.A 和 app.A.Sub 能够使用 GlobalA,但 app.B 不能使用它。
我该怎么做?
java包中绝对没有层次结构。只有名字。
所以包装a.suba
和a
没有特殊关系。您无法赋予“子包”特殊权限。
访问修饰符规则
Modifier Class Package Subclass World
public Y Y Y Y
protected Y Y Y N
no modifier Y Y N N
private Y N N N
根据上述规则,您希望 GlobalA 成为默认(无修饰符)访问。这将阻止 B 和不在 packageA 内的任何东西看到它。现在应该知道,当您声明一个 .java 文件时,您确实需要一个公共修饰符附加到与 .java 文件同名的 Object 上。即公共类 Foo 驻留在 Foo.java
由于SubA
和B
都是 的“外来”包A
,并且由于访问修饰符允许或禁止的所有内容都以类似的方式适用于所有“外来”包,因此在我看来,在逻辑上不可能通过简单地使用访问修饰符来区分SubA
和区分。B
使用反射可能是可能的,但我认为这不值得。
Java并没有真正使用语言中的子包模型;这只是组织相关代码的一种便捷方式。也就是说,如果您有 packages a
,a.b
并且b
(在您的术语中,a.b
是 的“子包” a
),那么您无法使用 package 中的类的访问修饰符以不同方式影响包中a
的代码。就 Java 而言,对.a.b
b
a.b
b
a