4

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

例子 :


打包一个 MyClass1

包 b MyClass2

包 c public MySharedClass


因为 c 是 public MySharedClass 将能够访问它,但问题是它也将对世界可见,我该如何防止呢?

4

5 回答 5

3

不平凡:

共享类可以由一组一般可访问的接口定义。实际的实现应该通过Classloader. 之后,只需应用 Java 安全管理机制来控制对实现类的访问。任何人都可以看到接口,并且对实际实现的访问将仅限于您的 SDK。

(上面的一个变体是每个 Web/应用程序服务器需要做的。你认为 Tomcat 是如何阻止你访问其他应用程序的“公共”类的?)

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

于 2011-12-27T18:00:20.717 回答
3

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

Java 中没有办法只为某些包公开一个类:它要么是public所有人的,要么是包私有的(仅在声明的包中公开)。

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

于 2011-12-27T17:47:35.953 回答
3

这些包在 Java 中都是“公共的”,您可以保护的是包中的类。要将类的可见性限制为仅给定的包,请像这样声明它(不带可见public性修饰符):

class MyClass {
    // ...
}

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

于 2011-12-27T17:43:58.847 回答
1

可以使用受保护的修饰符,以防您的类只能在同一个包中访问。否则没有可能。

于 2011-12-27T17:51:15.387 回答
1

如果该类由来自两个不同包的类共享,则这可能是一个很好的指示,表明这两个类应该与共享类一起在同一个包中,共享类不会是公共的,因此只能由以下类使用同一个包。

如果实在不行,只需适当地记录共享类,以表明它不应该在 SDK 内部代码之外使用,它可能会在未来版本中发生变化,并通过将包命名为“内部”来使其更加清晰"或类似的东西。

于 2011-12-27T17:47:08.373 回答