Нетривиально:
Общие классы могут определяться общедоступным набором интерфейсов.Фактическая реализация должна быть загружена явно через Classloader
.После этого просто примените механизмы управления безопасностью Java для контроля доступа к классам реализации.Любой может увидеть интерфейсы, и доступ к реальной реализации будет ограничен вашим SDK.
(Разновидность выше - это то, что должен делать каждый сервер веб-приложений. Как вы думаете, Tomcat не позволяет вам получить доступ к "общедоступным" классам некоторых приложений?)
edit: примечание вышеэто механизм времени выполнения.Есть и статические (пост) компиляции.APT, например, может быть эффективным здесь.Естественно, я говорю не о реструктуризации вашего пакета (в OP), а только о том, как обеспечить безопасный доступ к общему подходу.Но они немного «хакерские» - механизм загрузки классов во время выполнения каноничен и, пожалуй, более корректен.