如何向世界其他地方隐藏JavaAPI的内部结构

如何向世界其他地方隐藏JavaAPI的内部结构,java,api,design-patterns,Java,Api,Design Patterns,我正在开发一个JavaAPI来做一些事情(secret,uhhh;) 有没有办法隐藏类和API的内部结构 到目前为止,我发现: 使用内部类(丑陋的方式,我不想把所有内容都放在类文件中) 所有类都在一个包中,这样我就可以使用“包”-Visibility(也很难看,我需要更多的包) 例子: 有什么想法吗? 谢谢大家! 使用接口定义您的 应用程序可以 创建访问服务的主入口点,仅返回接口 我不必担心实际隐藏实现类。你永远无法在Java中真正隐藏它们,而那些对技术感兴趣的人可能只是用调试器启动你的应

我正在开发一个JavaAPI来做一些事情(secret,uhhh;)

有没有办法隐藏类和API的内部结构

到目前为止,我发现:
  • 使用内部类(丑陋的方式,我不想把所有内容都放在类文件中)
  • 所有类都在一个包中,这样我就可以使用“包”-Visibility(也很难看,我需要更多的包)
例子: 有什么想法吗? 谢谢大家!

  • 使用接口定义您的 应用程序可以
  • 创建访问服务的主入口点,仅返回接口
  • 我不必担心实际隐藏实现类。你永远无法在Java中真正隐藏它们,而那些对技术感兴趣的人可能只是用调试器启动你的应用程序。例如,只需不提供公共构造函数
关于这一评论:

肖恩,你能详细说明一下吗 更多关于你的答案

实现第二个要点的一种方法是使用服务查找类,例如

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

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

您所说的“隐藏”是什么意思

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

  • 您可以尝试只公开您的接口。看看工厂的模式
  • 或者,您可以在OSGI中实现您的应用程序
这两种方法都不允许您将实现完全隐藏给真正想看到它的人。有些人仍然可以使用反编译器检查您的.class文件,甚至检查内存中的代码


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

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

第一种是使用(实用API设计,Tulach 2008)中描述的Friend访问器/模式

第二个是使用OSGi


相关问题:、和。

这篇文章对你有帮助吗?嗨,泰,谢谢你的回答。我所说的隐藏是指“不可通过eclipse访问”。我不想将我的API的内部结构暴露给任何开发工具来访问API的内部结构(可能会改变)。从等式中完全删除Java并使用本机方法和JNI如何?谢谢你的回答,我正在寻找一种像你提供的设计方法。@Coffecunky你应该读一下。你会在那里学到更多的好东西。@Sean好的,但是我们不是回到了问题的起点了吗?所有类都在同一个包中吗?@glen如果你想强制类不能被实例化,这是最简单的方法,yes@soommy12Java是一种开放式语言,每个人都可以反编译您的代码。你唯一能做的就是避免混淆(例如使用ProGuard)。好的,谢谢你的回答!我在寻找一种设计方法。谢谢你的提示!
public class Lookup {
    private static final Foo foo = new FooImpl();
    public static Foo getFoo() { 
        return foo; 
    }
}