Как скрыть внутреннюю структуру Java API для остального мира

Я разрабатываю Java Api для выполнения вещей (секрет, uhhhh;).

Есть ли способ скрыть классы и внутреннюю структуру моего API?

То, что я нашел до сих пор:

  • Использование внутренних классов (уродливый способ, я не хочу вставлять все в файл класса)
  • Все классы в одном пакете, чтобы я мог использовать "package" -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{
    ...
}
---

Любые идеи? Спасибо!

Ответ 1

  • Используйте интерфейсы для определения того, приложение
  • Создайте главную точку входа для доступа к службам, только для возврата интерфейсов
  • Я бы не стал скрывать классы реализации. Вы никогда не сможете скрыть их на Java, и те, кто технически заинтересован, могут просто запустить ваше приложение с помощью отладчика. Просто не предоставляйте публичные конструкторы, например

Относительно этого комментария:

Шон, вы бы немного придумали больше на ваш ответ?...

Один из способов реализации моей второй маркерной точки - использование класса Lookup Lookup, например

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

Foo - это интерфейс, FooImpl класс реализации (который может быть закрытым пакетом, если вы хотите обеспечить, чтобы он не мог быть создан клиентами)

Ответ 2

Есть два решения вашего вопроса, которые не включают в себя сохранение всех классов в одном пакете.

Во-первых, используйте шаблон Friend Accessor/Пакет друзей, описанный в (Практический дизайн API, Tulach 2008).

Вторым является использование OSGi.

Вопросы, относящиеся: 1, 2, 3 и 4.

Ответ 3

Что вы подразумеваете под "скрыть"?

Вы можете использовать последний модификатор, чтобы люди не расширяли методы и классы, которые вы не хотите расширять. Если вы хотите, чтобы люди не декомпилировали ваш код, вы можете использовать обфускацию кода, и если вы хотите его использовать еще дальше, вы можете использовать анонимные внутренние классы, реализующие интерфейсы.

Ответ 4

  • Вы можете попробовать и открыть только свои интерфейсы. Посмотрите на шаблон Factory.
  • В качестве альтернативы вы можете реализовать свое приложение в OSGI.

Ни один из этих методов не позволит вам полностью скрыть реализацию для тех, кто действительно хотел ее увидеть. Кто-то все еще может использовать декомпилятор для изучения ваших файлов .class или даже проверки кода в памяти.

Если вам действительно необходимо защитить свою реализацию таким образом, тогда хороший подход будет состоять только в том, чтобы разрешить доступ к вашему приложению в качестве удаленного сервиса и разместить его на защищенной машине.