如何制作私人包裹?

时间:2019-03-09 11:03:44

标签: java intellij-idea jar

我正在图书馆。我有三个包:

enter image description here

电子表格是主程序包。 io软件包是供内部使用的内部软件包。不幸的是,由于它们是公共类,因此用户可以访问它们。

我想保留此程序包,因为它允许我在编程时分离概念,但我想将这些类“隐藏”给最终用户。

我该怎么办?

2 个答案:

答案 0 :(得分:1)

从java9开始,您可以将此库转换为模块。参见this jigsaw tutorial

模块需要导出一个软件包,以便其他成员可以访问其公共成员:只需不导出您的内部软件包,它就不会可见。

您还可以使用OSGi之类的东西,这是java9之前的模块系统。它也有这样的观念,那就是超越公众的水平(我们称之为“可见”)。

最后一个选择是使用classloader恶作剧(例如,在构建阶段,您将类文件重命名为其他扩展名,并在可见包中包含一个小的引导程序,从而创建一个classloader,该类加载器通过查找相同的类来加载类放置为可见的API,然后加载具有备用扩展名的文件,然后将defineClass加载到文件中),但这是一个艰巨的步骤,带来了很多麻烦。除非您有充分的理由钻进这个兔子洞,否则我不会接受。

答案 1 :(得分:1)

您问自己这个问题很好!我最近对此没有多大关注。

由于OdsReaderOdsWriter仅在Spreadsheet类中使用,因此只需将它们移到spreadsheet包中,删除 { 1}}可见性键盘。现在,只能从public包的类中访问它们。

上面提出的解决方案对于您的用例而言过于复杂,并且将使用spreadsheed modules (或OSGi-请不要!),实际上并不是必需的。在这里,但这对于将定义保持私有和密封甚至对Java 9+滥用者而言,都是向前迈出的一步。


作为旁注,我看到您有一个Reflection包。
我从不建议这样做,因为您必须向代码用户公开这些异常的构造函数,并且他们可以出于 no 充分的理由而实例化它们。

在使用它们的程序包中移动异常,并将构造函数声明为私有程序包。