Вы можете сделать это с OSGi. Android и JDK 6 в качестве цели в этом случае не являются проблемой, существуют платформы OSGi, работающие на Android -> например. см. сервер mBedded для Android. Скачать бесплатную некоммерческую версию можно по ссылке.
У вас есть несколько вариантов, как это сделать в OSGi, в зависимости от того, чего вы хотите достичь.
Вариант 1 (рекомендуемый): Вы можете поместить пакеты А и Б в один и тот же бандл АВ, а в манифесте этого бандла экспортировать только пакет Б с помощью Export-Package. Пакет/приложение C или любое другое «пользовательское» приложение может импортировать пакет B и использовать его. И он не может использовать и даже не видит пакет А, потому что он внутренний для связки АВ. Вам не нужны никакие специальные объявления или зависимости на уровне Java; это будет работать с ЛЮБОЙ версией Jva, потому что модульность и отдельные пространства пакетов являются частью основ OSGi и не зависят от последней версии Java или чего-то еще.
Вариант 2. Если по какой-то причине вы хотите, чтобы пакеты A и B были разделены на разные пакеты, вы можете иметь их таким образом, что вы будете экспортировать и импортировать пакеты в манифесте, а затем контролировать, какой пакет имеет право импортировать какой пакет с помощью разрешений. (см. службы разрешений OSGi и условных разрешений). Однако реализовать это сложнее.
Вариант 3. Вы также можете поместить пакет A в пакет Fragment и разрешить ему присоединяться к пакету, содержащему B. Таким образом, B будет иметь доступ к пакету A, но в то же время вы сможете обновить пакет A отдельно. во время выполнения, если хотите. Поскольку пакеты во фрагментах рассматриваются как частные для пакета узла (в данном случае узел — это пакет, содержащий пакет B), пакет C не увидит A. Он увидит только то, что экспортируется пакетом B.
Поскольку вы не очень хорошо знакомы с OSGi, я рекомендую начать с варианта 1, а затем, при необходимости, вы можете обновить свой подход до варианта 3, если хотите.
@Edwin Dalorzo: Это определенно неправда, что правила в OSGi могут быть нарушены отражением. Пакеты имеют отдельные загрузчики классов в OSGi. Вы можете размышлять о Bundle C столько же, сколько и о классах A, и единственное, что вы получите, - это исключение ClassNotFound - поверьте мне, я видел это достаточно раз;)
person
pooh
schedule
14.06.2012