如果我在软件包中创建一个名为 MyClassA
的项目 com/a/b/c
定义如下:
public class MyClassA {
public static void main(String[] args) {
}
String sayHi() {
return "hi";
}
}
如果我将该项目导出为jar,并在软件包中创建另一个名为 MyCassA
的项目,并在 com/a/b/c
中导入我之前导出的jar,什么使我无法看到包裹受保护的方法 sayHi()
?
我通过删除我作为罐子导出的第一个项目来尝试此操作。当我尝试此操作时,我会遇到一个汇编错误,说该方法不可见。
答案告诉您,没有什么可以防止它错误的。
您可以密封包装。密封包是一个包裹,可以在一个.jar文件中定义。Java运行时将拒绝该软件包中定义的任何类。
密封包装很简单。在包含.jar文件的清单中,为该软件包添加一个部分,并包括一个 Sealed: true
属性:
Name: com/a/b/c
Sealed: true
不多。虽然您不使用Java9,但启用了模块支持。
通过简单地"伪造"它们,偷偷溜入现有软件包是没有问题的。作为其他答案,您可以在JAR文件中通过元数据密封包装。而且,当您进一步考虑签署JAR文件时,似乎是可能的。但是我想即使那样,使用类加载器魔术也可能会有技巧。
在Java 8或更低中,没有什么可以不允许您这样做的。换句话说,允许。
在Java 9中,模块系统将强制执行软件包只能在单个模块中