Получить имя пакета расширенного класса

Допустим, у нас есть базовый класс:

package mobi.hsz.app.plugin;
abstract class Plugin {}

И расширенный класс:

package 3rd.party.plugin;
ThirdPartyPlugin extends Plugin {}

Можно ли получить имя пакета расширенного класса в базовом классе?

Я должен получить в моем абстрактном классе простую строку

3rd.party.plugin

3 ответа

Решение

Небольшой код отражения должен работать здесь:

getClass().getPackage().getName()

getClass() метод получает Class объект для экземпляра, getPackage() получает Package объект и getName() возвращает полное имя пакета.

Полиморфизм Java обеспечит Class объект (здесь, ThirdPartyPlugin) возвращается из getClass(),

Это невозможно. Класс не знает своих подклассов и не должен иметь его.

Кроме того, как указал @hexafraction: что, если существует более одного подкласса?

Это действительно звучит так, как будто вы хотите все подклассы.

Если это так, если ваш суперкласс знает, что все реализации подкласса пахнут плохо - это нарушает принцип Open Closed.

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

В противном случае, если вы используете хорошую платформу поддержки, такую ​​как OSGi, вы можете просто зарегистрировать плагины.

Другие вопросы по тегам