Могут ли пользователи моей модульной библиотеки получить доступ к классам, которые не были экспортированы? - PullRequest
2 голосов
/ 14 марта 2019

Я пытаюсь ознакомиться с модульной системой, представленной в Java 9, и мне хотелось бы узнать, как лучше ее использовать.

Для библиотеки, которую я пишу, я хотел бы сделать следующее (игнорировать именование пакетов):

  • Предоставлять только интерфейсы, простые классы POJO и классы фабрикичерез com.myproject.api.Все в этом классе может быть использовано пользователями.
  • Поместите реализацию интерфейсов в com.myproject.core.Пользователи не должны иметь доступа к чему-либо здесь.

Я рассуждаю так: пользователям не нужно запутываться или перегружаться логикой реализации.Вместо этого они могут просто посмотреть (надеюсь) на чистые и хорошо документированные интерфейсы.

Однако из-за того, как работают пакеты Java, может быть сложно ограничить использование определенных классов, не делая их все пакеты закрытыми.Но я не люблю складывать все классы в один пакет, а скорее организовывать их в разные пакеты.

После прочтения о модульной системе я считаю, что могу сделать следующее, чтобы добиться того, чего я хочу.Это файл module-info.java:

module com.myproject {
    exports com.myproject.api;
}  

Насколько я понимаю, пользователи моей библиотеки смогут использовать все, что определено в пакете com.myproject.api (используя require com.mypojrect.api в своем собственном модуле -информационный файл).

Но могут ли пользователи получить доступ к чему-либо в пакете com.myproject.core?У меня нет проблем с их просмотром кода (через IDE или сам исходный код), но я просто не хочу в конечном итоге поддерживать классы / методы / логику, которые я не хотел раскрывать.

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

Пожалуйста, дайте мне знать, если вам нужна какая-либо другая информация.

1 Ответ

6 голосов
/ 14 марта 2019

Пользователь вашей библиотеки до JDK9 не может существовать, так как вы собираетесь использовать Модуль платформы Java , который является пост-JDK8, и, таким образом, вы собираетесь скомпилировать для версии класса больше 52.

Сказал, что ваши пользователи смогут просматривать исходный код (если он поставляется), и, очевидно, они смогут извлечь ваши .class файлы.


По определению

тип в модуле не доступен для других модулей, если это не публичный тип и вы экспортируете его пакет.

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

opens your.package

директива. Так что, в основном, вы охвачены также аспектом Reflection.
И директива opens предоставляет Reflection только публичные определения.


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

...