Сообщение Re: Скрытие имплементации при проектировании Java библиотек от 05.06.2023 10:39
Изменено 05.06.2023 10:42 vsb
Re: Скрытие имплементации при проектировании Java библиотек
Механизм называется java modules. Вы указываете, какие пакеты экспортируются. Правда ими далеко не все пользуются, а если не пользуются, то всё это игнорируется.
Второй вариант это использовать два jar. Первый jar клиент подключает как обычно, второй jar клиент подключает как runtime, в итоге при компиляции к классам второго jar он не будет иметь доступа.
Второй вариант это использовать два jar. Первый jar клиент подключает как обычно, второй jar клиент подключает как runtime, в итоге при компиляции к классам второго jar он не будет иметь доступа.
Re: Скрытие имплементации при проектировании Java библиотек
Механизм называется java modules. Вы указываете, какие пакеты экспортируются. Правда ими далеко не все пользуются, а если не пользуются, то всё это игнорируется.
Второй вариант это использовать два jar. Первый jar клиент подключает как обычно, второй jar клиент подключает как runtime, в итоге при компиляции к классам второго jar он не будет иметь доступа.
Понятно, что если клиент захочет, то получит. Впрочем он и так получит, если захочет, через reflection или редактирование байткода (добавить модификатор public несложно) или ещё как-нибудь.
Если прям совсем не хотите, чтобы туда даже смотрели, можете обфусцировать этот пакет. Формально он останется public, но там никто ничего не поймёт.
А так — в рамках Java 8 ничего сделать нельзя. Если нужно использовать класс из пакета, он должен быть public. Если он public, то его может использовать кто угодно.
Второй вариант это использовать два jar. Первый jar клиент подключает как обычно, второй jar клиент подключает как runtime, в итоге при компиляции к классам второго jar он не будет иметь доступа.
Понятно, что если клиент захочет, то получит. Впрочем он и так получит, если захочет, через reflection или редактирование байткода (добавить модификатор public несложно) или ещё как-нибудь.
Если прям совсем не хотите, чтобы туда даже смотрели, можете обфусцировать этот пакет. Формально он останется public, но там никто ничего не поймёт.
А так — в рамках Java 8 ничего сделать нельзя. Если нужно использовать класс из пакета, он должен быть public. Если он public, то его может использовать кто угодно.