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