【问题标题】:How to hide the internal structure of a Java API to the rest of the world如何向世界其他地方隐藏 Java API 的内部结构
【发布时间】:2011-08-17 20:17:20
【问题描述】:

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

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

到目前为止我发现了什么:

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

示例:

---
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{
    ...
}
---

有什么想法吗? 谢谢!

【问题讨论】:

标签: java api design-patterns


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

关于此评论:

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

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

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

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

【讨论】:

  • 感谢您的回答,我正在寻找您提供的设计方法。
  • @CoffeJunky 你应该阅读Effective Java by Josh Bloch。您将在那里学到更多好东西。
  • @Sean 好的,但是我们不是回到了我们开始提出所有这些问题的地方——所有类都在同一个包中吗?
  • @glen 如果你想强制类不能被实例化,这是最简单的方法,是的
  • @soommy12 Java 是一种开放语言,每个人都可以反编译您的代码。您唯一可以做的就是混淆(例如使用 ProGuard)。
【解决方案2】:

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

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

二是使用OSGi。

相关问题:1234

【讨论】:

    【解决方案3】:
    • 您可以尝试只公开您的接口。看看工厂模式。
    • 或者,您可以在 OSGI 中实现您的应用程序。

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

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

    【讨论】:

    • 好的,谢谢您的回答!我正在寻找一种设计方法。谢谢你的提示!
    【解决方案4】:

    “隐藏”是什么意思?

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

    【讨论】:

    • 嗨,你的回答。隐藏我的意思是“无法通过 Eclipse 访问”。我不想将我的 API 的内部结构暴露给任何开发工具来访问 API 的内部(可能是 chaning)结构。
    • 完全从等式中删除 Java 并使用本机方法和 JNI 怎么样?
    猜你喜欢
    • 2013-04-28
    • 1970-01-01
    • 2013-08-10
    • 1970-01-01
    • 1970-01-01
    • 2015-09-30
    • 1970-01-01
    • 1970-01-01
    • 2015-06-01
    相关资源
    最近更新 更多