如何将Java API的内部结构隐藏到世界其他地方

我正在开发一个Java Api来做事情(秘密,呃嗯;)。

有没有办法隐藏类,以及我的API的内部结构?

我到现在才发现:

  • 使用内部类(丑陋的方式,我不想把所有内容放在类文件中)
  • 一个包中的所有类,以便我可以使用“包”-visibilty(也丑,我需要更多的包)

例:

--- package net.my.app; //this is the Public Access class MyPublicClass{ public void somePublicFunction(){ //access to not visibil classes } } --- package net.my.app.notvisible: //this is what i want to hide class MyNOTPublicClass{ ... } --- 

有任何想法吗? 谢谢!

  • 使用界面来定义您的应用程序的function
  • 创建一个主入口点来访问服务,仅返回接口
  • 我不打算真正隐藏实现类。 你永远不能真正隐藏它们在Java中,那些技术上感兴趣的人可能只是用调试器启动你的应用程序。 例如,不要提供任何公共构造函数

关于这个评论:

肖恩,你会详细说明你的答案吗? …

实现我的第二个要点的一种方法是指使用Service Lookup类,例如

 public class Lookup { private static final Foo foo = new FooImpl(); public static Foo getFoo() { return foo; } } 

Foo是一个接口, FooImpl是一个实现类(如果你想强制它不能被客户端实例化,它可以是包私有的)

您的问题有两种解决方案,不涉及将所有类保留在同一个包中。

第一种是使用(Practical API Design,Tulach 2008)中描述的Friend Accessor / Friend Package模式。

第二是使用OSGi。

相关问题: 1,2,3和4 。

“隐藏”是什么意思?

您可以使用final修饰符来阻止人们扩展您不希望它们扩展的方法和类。 如果你想阻止人们反编译你的代码,你可以使用代码混淆,如果你想更进一步,你可以使用实现接口的匿名内部类。

  • 您可以尝试仅公开您的界面。 看看工厂模式。
  • 或者,您可以在OSGI中实现您的应用程序。

这些方法都不允许您将实现完全隐藏给真正想要查看它的人。 有人仍然可以使用反编译器检查你的.class文件,甚至检查内存中的代码。

如果您确实需要以这种方式保护您的实现,那么一个好的方法是仅允许您的应用程序作为远程服务访问并将其托管在安全的计算机上。