Подтвердить что ты не робот

Можно ли получить все подклассы класса?

Возможный дубликат:
Как вы находите все подклассы данного класса в Java?

Привет,

Я хотел бы получить список классов, которые реализуют интерфейс в Java во время выполнения, поэтому я могу сделать сервис поиска без необходимости его жесткого кодирования. Есть ли простой способ сделать это? Я не боюсь.

4b9b3361

Ответ 1

Короткий ответ - нет.

Длинным ответом является то, что подклассы могут появляться во многих отношениях, что в принципе делает невозможным категорически найти их все.

Вы не можете сделать это во время выполнения, но вы не можете найти классы до тех пор, пока они не загрузятся и как вы знаете, что они загружены? Вы можете сканировать каждый JAR и файл класса, но это не является окончательным. Кроме того, есть такие вещи, как загрузчики классов URL.

Другими случаями являются внутренние классы (статические и нестатические). Именованные внутренние классы легче найти. Анонимные внутренние классы потенциально намного сложнее найти.

Вы также должны учитывать, что если класс имеет подклассы, тогда новые подклассы могут быть созданы в более поздней точке.

Ответ 2

вы должны использовать Java ServiceLoader, который является встроенным классом. Он способен выполнять итерацию во время выполнения во всех реализациях know service (interface).

Если по какой-то причине вы этого не хотите, вы можете использовать ClassLoader.getSystemResources() для перебора всех ресурсов; например если у вас в 6 раз больше файла /META -INF/com.interface, вы получите 6 итераций.

Ответ 3

Я всегда могу создать новый подкласс для любого непредельного класса, добавить подкласс в путь к классам и победить ваши намерения. Подклассификация - это открытое предложение.

О лучшем, что вы можете сделать, это сказать, что для данного пути к классам вы знаете, что такое подклассы, и для этого вам придется сканировать каждый класс в пути к классам.

Ответ 5

Единственный способ, которым вы могли бы это сделать, - это пройти иерархию пакетов для пакетов, доступных в пути к классам, проверяя каждый класс посредством отражения (и это сосать, потому что вы эффективно загружаете каждый класс, если только вы не ограничиваете свой поиск к определенным пакетам).

Проблема с подобным автомагическим поведением состоит в том, что становится трудно количественно оценивать приложение без его запуска, что является головной болью обслуживания. Я всегда предпочел бы перейти через инспекторский маршрут (a-la Spring) через какую-то конфигурацию.

Ответ 6

Я пытаюсь рассуждать через ответ здесь, поэтому я, вероятно, ошибаюсь. Для класса не имеет смысла иметь информацию о своих потомках или подклассах, поскольку в любой момент времени кто-то может создать новый подкласс вашего класса. Затем вам придется перекомпилировать ваш класс, чтобы каждый раз включать эту новую информацию. Это не имеет смысла для расширяемого кода. Скорее всего, класс должен содержать информацию о своих предках. Поэтому единственное решение, которое я вижу, - это перебрать все классы в проблемном пространстве и проверить, но это более чем вероятно ужасное решение для вас.

Ответ 7

Вы хотите перечислить классы, которые реализуют определенный интерфейс или перечисляют классы, которые происходят из какого-то базового класса? Это два разных вопроса. И то, и другое, насколько мне известно, будет сложно реализовать, так как в будущем в будущем могут быть созданы/установлены новые версии на ПК. Похоже, вы пытаетесь создать метод factory для создания экземпляра конкретного экземпляра, и вы не хотите жестко кодировать имя класса в коде. Обычно использование файла конфигурации, который перечисляет все классы, реализующие интерфейс, - это путь (или база данных может использоваться). Когда новые классы реализуют интерфейс, вы добавляете их в файл конфигурации, а factory должен забрать новое имя класса.

Ответ 8

Если вы загружаете только классы с диска или из URL-адресов, вы можете сканировать путь к классам и находить подклассы "вручную".