代码之家  ›  专栏  ›  技术社区  ›  BigBug

是什么阻止您在包中声明其他类,从而允许您访问包私有成员

  •  0
  • BigBug  · 技术社区  · 7 年前

    如果我创建一个名为 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导出的第一个项目。当我尝试这个方法时,我得到了一个编译错误,表示该方法不可见。

    3 回复  |  直到 7 年前
        1
  •  3
  •   VGR    7 年前

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

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

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

    Name: com/a/b/c
    Sealed: true
    
        2
  •  1
  •   GhostCat    7 年前

    不多当您不使用Java9时 module 支持已启用。

    通过简单地“伪造”现有软件包,就可以潜入其中。正如另一个答案所述,您可以通过jar文件中的元数据密封一个包。当你进一步考虑签署jar文件时,某种程度上似乎是可能的。但我想即使这样,也可能会有一些使用类装入器魔术的技巧。

        3
  •  0
  •   Jorn    7 年前

    在Java 8或更低版本中,没有什么不允许您这样做。换句话说,这是允许的。

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