Получить имя пакета расширенного класса
Допустим, у нас есть базовый класс:
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, вы можете просто зарегистрировать плагины.