问题 如何将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{
    ...
}
---

有任何想法吗? 谢谢!


12853
2018-05-03 15:47


起源

这个SO帖子对你有帮助吗? stackoverflow.com/questions/3857895/hide-public-classes-in-jar - Chris Thompson


答案:


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

关于这个评论:

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

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

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

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


4
2018-05-03 15:50



感谢您的回答,我正在寻找像您提供的设计方法。 - CoffeJunky
@CoffeJunky你应该读 Josh Bloch的有效Java。你会在那里学到更多好东西。 - Sean Patrick Floyd
@glen看到我的更新 - Sean Patrick Floyd
@Sean好的,但是我们不是回到我们开始的地方提出所有这一切的问题 - 同一个包中的所有类? - Jeff Axelrod
@ soommy12 Java是一种开放式语言,每个人都可以反编译你的代码。你唯一可以做的就是混淆(例如使用ProGuard)。 - Sean Patrick Floyd


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

首先是使用Friend Accessor /朋友套餐 (Practical API Design,Tulach 2008)中描述的模式。

第二是使用OSGi。

相关问题: 123,和 4


8
2018-05-27 15:20





“隐藏”是什么意思?

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


0
2018-05-03 15:54



嗨,你的答案。通过隐藏我的意思是“不能用eclipse访问”。我不想将我的API的内部结构暴露给任何开发工具来访问API的内部(可能是chaning)结构。 - CoffeJunky
如何完全从方程中删除Java并使用本机方法和JNI? - spot35


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

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

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


0
2018-05-03 15:58



好的,谢谢你的回答!我正在寻找一个设计方法。谢谢你的提示! - CoffeJunky