包装和知名度

我正在制作SDK,我正在尝试将类分离到不同的包,这些类使用其他一些共享类。 问题是如果我公开共享类,每个人都能看到它们,而不仅仅是我的类。 什么是使它们只能由我的应用程序访问的正确方法?

示例:


打包MyClass1

包装b MyClass2

包c公共MySharedClass


因为c是公共的MySharedClass将能够访问它,但问题是它也将对世界可见,我怎么能阻止它呢?

创建一个记录为内部包的包,不要由客户端使用。

Java中没有办法只为某些包公开一个类:它对每个人都是public ,或者是包私有的 (仅在声明的包中是public)。

我认为有一个模块的提议可以更好地控制类的可见性,但我们必须至少等待Java 8。

这些包在Java中都是“公共的”,你可以保护的是包中的类。 要将类的可见性限制为仅给定包,请将其声明为此( 使用public可见性修饰符):

 class MyClass { // ... } 

这样,只有与MyClass在同一个包中的类才能看到它。

非平凡的:

共享类可以由通常可访问的接口集定义。 应通过Classloader显式Classloader实际实现。 之后,只需应用Java安全管理机制来控制对实现类的访问。 任何人都可以看到界面和对实际实现的访问权限仅限于您的SDK。

(以上是每个Web / app服务器需要做的事情。您认为Tomcat如何阻止您访问其他应用程序的“公共”类?)

编辑:注意上面是一个运行时机制。 还有静态(后)编译方法。 例如,APT在这里可能有效。 当然,我不是要解决您的软件包重组(在OP中),而只是解决如何保护对一般方法的访问。 但这些有点’hacky’ – 类加载的运行时机制是规范的,而且imo严格地说更正确。

如果该类由来自两个不同包的类共享,则可以很好地指示这两个类应该在同一个包中,以及共享类,该共享类不是公共的,因此只能由类的相同的包裹。

如果它真的不是一个选项,只需适当地记录共享类,以表明它不应该在SDK内部代码之外使用,它将在未来版本中更改,并通过命名包“内部”使其更清晰“或者是这样的。

protected modifier可以使用,如果您的类只能在同一个包中访问。 否则没有可能。