Как я могу перечислить все дочерние классы суперкласса в Java - PullRequest
1 голос
/ 17 февраля 2010

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

Я искал Javadocs для java.lang.ClassLoader, но не могу найти какой-либо метод, который делает это.

Я пытаюсь реализовать шаблон «Product Trader» (http://www.ubilab.com/publications/print_versions/pdf/plop-96-producttrader.pdf), с классами «саморегистрация» в абстрактном суперклассе. Суперкласс будет иметь HashMap, который отображает сервис, предоставляемый подклассом, и Java Файл .lang.Class, который обрабатывает этот сервис.

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

Спасибо, Ральф

Ответы [ 3 ]

5 голосов
/ 17 февраля 2010

Это вообще не решаемо. ClassLoader не обязан иметь возможность перебирать классы, которые он может загрузить. Самый простой пример ClassLoader, который не может сделать, это когда вы загружаете классы из базового URL http://: HTTP не предоставляет стандартизированного способа перечисления содержимого любого данного URL.

Лучший способ реализовать это - использовать ServiceLoader и позволить всем реализующим классам зарегистрироваться через простую запись в своем файле jar.

0 голосов
/ 17 февраля 2010

Это явно не решаемо очень просто.

Однако, есть решения, подобные упомянутому в этой статье Javaworld .

Вообще говоря, оно состоит висследовать все элементы из CLASSPATH.если это jar-файлы, исследуйте их в поисках классов, загрузите эти классы и посмотрите, расширяют ли они ссылочный базовый класс.Однако я настоятельно рекомендую вам использовать более «зрелый» механизм, такой как IoC или архитектура плагинов.

Я, очевидно, думаю о JSPF , в качестве примера.

0 голосов
/ 17 февраля 2010

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

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

[Обратите внимание, что ServiceLoader, предложенный Joachim Sauer, или среда, которая обеспечивает аналогичный механизм, является гораздо лучшим решением]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...