-
16-10-2019 - |
题
在JAR文件中隐藏一些类真的不可能吗?
我希望不允许直接实例化课程,以使其更加灵活。该罐子只能看到工厂(或立面)。
除了解决这个问题之外,还有其他方法吗? (两个项目:第一个项目包含类(实现),另一个针对第一个的引用并包含工厂;后来仅引用第二个引用)
解决方案
我认为,如果您的公共工厂方法试图返回“隐藏”的东西,您将有编译器故障或警告。
不,您不能不重新实现自己的公共课程 ClassLoader
或使用OSGI或类似的东西。
您可以做的是将接口API与实现分开,例如,一个项目仅包含接口和另一个包含隐藏的孔子。但是,您仍然无法隐藏实现类。
其他提示
我知道您不是要隐藏实际的课程,而只是防止其在工厂课程之外的建设。我认为,通过在类构造函数中使用包装私有(默认)可见性可以很容易地实现。唯一的限制是,您需要将课程和工厂放在同一软件包中,因此在大型代码库中,可能会变得不必要地复杂。
混淆 能帮你 不知何故.
使用标准classloaders一个普通的旧罐子文件,这是不可能的。 OSGI CAS这个概念是使其他捆绑包仅某些软件包,而不是其他捆绑包(即公共API和内部实施的分离)。
如果您是usinf Eclipse,则可以使用 这个
如果我说“不允许直接实例化以保持灵活性”时正确理解您,则正确执行的立面模式将处理此操作。
限制您要隐藏的所有类的构造函数以包装范围。将立面班级开放给公共范围。
http://mindprod.com/jgloss/packagescope.html
“如果您的班级中有变量或方法,您不希望班级的客户直接访问,请不要向公开,受保护或私人声明。由于Java的设计进行了监督,您可以' t明确声明默认的“软件包”可访问性。软件包的其他成员将能够看到它,但是包裹外继承的类的类不会。受保护的可访问性属性提供了更多的可见性。可见的方法是可见的。要继承类,即使不是同一软件包的一部分。软件包范围(默认)方法不是。这是受保护范围和软件包范围之间的唯一区别。”
您可以使用自定义类加载程序进行此类魔法,但是:
- 正确的分离只能在由您的课堂装载机配备的项目中获得;
- 创建这样的装载机的努力确实值得怀疑。
在这种情况下,我会做类似于我们在标准Java中看到的事情。埃及看 javax.xml.stream.XMLInputFactory
但是你有 com.sun.xml.internal.stream.XMLInputFactoryImpl
. 。如果您写的话,这是完全可以编译的:
new com.sun.xml.internal.stream.XMLInputFactoryImpl()
尽管您几乎不会做到这一点:-)使用系统属性,您可能会控制正在加载的实际实现。对我来说,这种方法在许多情况下都很好。
我希望我能正确理解您的问题;)
干杯!