Использование Reflections для нахождения (транзитивных) подтипов класса, когда не все типы в иерархии находятся в отфильтрованном URL пути к классу
Я пытаюсь использовать библиотеку Reflections, чтобы получить все подклассы определенного класса. Мне нужно отфильтровать поиск только по подклассам в определенном URL пути к классу. Это код, который я использую:
ConfigurationBuilder config = new ConfigurationBuilder();
config.addUrls(<my_url>);
Reflections reflections = new Reflections(config);
Set<Class<? extends A>> set = reflections.getSubTypesOf(A.class)
Моя проблема заключается в следующем: давайте предположим, что класс B расширяет A, а класс C расширяет B. Итак, мы имеем:
A <|-- B <|-- C
A и B находятся в URL-адресе класса, отличающемся от URL-адреса C. И URL-адрес, данный для отражений, является URL-адресом C. Тогда я ожидал бы, что C будет в возвращенном наборе, а B не должен присутствовать, поскольку он находится в другом URL-адрес classpath
Однако возвращенный набор пуст. C не входит в набор классов, возвращаемых отражениями, хотя он является транзитивным потомком A. Если я переместлю B на тот же URL-адрес пути к классу C, то и B, и C будут возвращены. Тогда я предполагаю, что проблема в том, что Reflections по умолчанию не отвечает (транзитивным) подклассам, если какой-либо из классов в середине иерархии не находится в отфильтрованном URL.
Мои вопросы: как я могу дать указания отражениям отвечать (транзитивным) подклассам определенного класса, даже если определенные классы в середине иерархии не находятся в отфильтрованном URL (но сам подкласс находится в отфильтрованном URL)?
1 ответ
Дело в том, что транзитивность не может обнаружить, если не все соответствующие URL сканируются. Вы должны знать свой путь к классу.
Если вы не знаете всех задействованных URL, вы можете отсканировать все URL, используя
ClasspathHelper.forClassLoader()