Как скрыть внутреннюю структуру Java API для остального мира - PullRequest
11 голосов
/ 03 мая 2011

Я занимаюсь разработкой 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{
    ...
}
---

Есть идеи?Спасибо!

Ответы [ 4 ]

8 голосов
/ 27 мая 2011

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

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

Второй - использовать OSGi.

Смежные вопросы: 1 , 2 , 3 и 4 .

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

По поводу этого комментария:

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

Один из способов реализации моей второй маркированной точки, я имею в виду использование класса поиска служб, например,

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

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

0 голосов
/ 03 мая 2011
  • Вы можете сделать общедоступными только ваши интерфейсы.Посмотрите на фабричный шаблон.
  • В качестве альтернативы вы можете реализовать свое приложение в OSGI.

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

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

0 голосов
/ 03 мая 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...