我正在制作一个 SDK,我正在尝试将类分离到不同的包中,这些类使用其他一些共享类。问题是如果我公开共享课程,每个人都可以看到它们,而不仅仅是我的课程。使它们只能由我的应用程序访问的正确方法是什么?
例子 :
打包一个 MyClass1
包 b MyClass2
包 c public MySharedClass
因为 c 是 public MySharedClass 将能够访问它,但问题是它也将对世界可见,我该如何防止呢?
我正在制作一个 SDK,我正在尝试将类分离到不同的包中,这些类使用其他一些共享类。问题是如果我公开共享课程,每个人都可以看到它们,而不仅仅是我的课程。使它们只能由我的应用程序访问的正确方法是什么?
例子 :
打包一个 MyClass1
包 b MyClass2
包 c public MySharedClass
因为 c 是 public MySharedClass 将能够访问它,但问题是它也将对世界可见,我该如何防止呢?
不平凡:
共享类可以由一组一般可访问的接口定义。实际的实现应该通过Classloader
. 之后,只需应用 Java 安全管理机制来控制对实现类的访问。任何人都可以看到接口,并且对实际实现的访问将仅限于您的 SDK。
(上面的一个变体是每个 Web/应用程序服务器需要做的。你认为 Tomcat 是如何阻止你访问其他应用程序的“公共”类的?)
编辑:上面的注释是一个运行时机制。还有静态(后)编译方法。例如,APT 在这里可能很有效。自然,我不是在解决您的包的重组(在 OP 中),而只是解决如何保护对一般方法的访问。但是这些有点“hacky”——类加载的运行时机制是规范的,而且imo严格来说更正确。
创建一个记录为内部包的包,不供客户使用。
Java 中没有办法只为某些包公开一个类:它要么是public
所有人的,要么是包私有的(仅在声明的包中公开)。
我认为有一个关于模块的提议,以允许更好地控制类的可见性,但我们至少要等待 Java 8。
这些包在 Java 中都是“公共的”,您可以保护的是包中的类。要将类的可见性限制为仅给定的包,请像这样声明它(不带可见public
性修饰符):
class MyClass {
// ...
}
这样,只有与 MyClass 在同一包中的类才能看到它。
可以使用受保护的修饰符,以防您的类只能在同一个包中访问。否则没有可能。
如果该类由来自两个不同包的类共享,则这可能是一个很好的指示,表明这两个类应该与共享类一起在同一个包中,共享类不会是公共的,因此只能由以下类使用同一个包。
如果实在不行,只需适当地记录共享类,以表明它不应该在 SDK 内部代码之外使用,它可能会在未来版本中发生变化,并通过将包命名为“内部”来使其更加清晰"或类似的东西。