是什么阻止您在包中声明其他类,使您可以访问包私有成员

时间:2017-11-23 13:26:42

标签: java

如果我在包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,那么我无法看到包受保护的方法{ {1}}?

我通过删除我作为jar导出的第一个项目尝试了这个。当我尝试这个时,我得到一个编译错误,说该方法不可见。

3 个答案:

答案 0 :(得分:3)

答案告诉你没有什么可以阻止它是错误的。

你可以seal你的包裹。密封包是可以在一个且仅一个.jar文件中定义的包。 Java运行时将拒绝该.jar文件之外的该包中定义的任何类。

封装包很简单。在包含.jar文件的清单中,为该包添加一个部分,并包含Sealed: true属性:

Name: com/a/b/c
Sealed: true

答案 1 :(得分:1)

不多。虽然您没有使用Java9,但启用了module支持。

通过简单地“伪装”它们来潜入现有的包装是没有问题的。正如其他答案所述,您可以通过jar文件中的元数据密封包。当你进一步考虑签署jar文件时,似乎有可能达到某种程度。但我想即便如此,也许会有使用类加载器魔术的技巧。

答案 2 :(得分:0)

在Java 8或更低版本中,没有什么会禁止你这样做。换句话说,它是允许的。

在Java 9中,模块系统将强制包只能在单个模块中