Получить все классы из classpath, который наследует класс X по суперклассу X - PullRequest
0 голосов
/ 22 января 2020

Допустим, у меня есть запечатанный класс A с B и C, унаследовавший его.

sealed class A
open class B(): A()
open class C(): A()

Теперь у меня есть несколько классов в отдельных файлах, скажем, classpath: com.dummy с наследованием класса B или C

class D : B(){}

class E : C(){}

class F : B(){}

Теперь я хочу отсканировать все классы с учетом classpath и типа суперкласса B или C, то есть A.

Фрагмент, который я пытаюсь выполнить. достичь этого, но не работает

val ref = Reflections("com.dummy", SubTypesScanner(false))
val clazzes = ref.getSubTypesOf(A::class.java)

Это возвращает 0 классов. Если я изменю getSubTypesOf (B :: class. java), то смогу получить все классы, которые унаследовали B.

1 Ответ

0 голосов
/ 22 января 2020

Я протестировал его в соответствии с вашим описанием, и он работает как ожидалось:

Отдельный путь к классу:

package com.dummy

import sub.types.test.B
import sub.types.test.C

class D : B(){}

class E : C(){}

class F : B(){}

Запечатанный класс и тест:

package sub.types.test

import org.reflections.Reflections
import org.reflections.scanners.SubTypesScanner


sealed class A
open class B(): A()
open class C(): A()

fun main() {
  val ref = Reflections("com.dummy", SubTypesScanner(false))
  var clazzes: Set<Class<*>> = ref.getSubTypesOf(A::class.java)
  println("A subclasses")
  println(clazzes)
  clazzes = ref.getSubTypesOf(B::class.java)
  println("B subclasses")
  println(clazzes)
}

Вывод на консоль:

12:38:19.102 [main] INFO org.reflections.Reflections - Reflections took 64 ms to scan 1 urls, producing 2 keys and 3 values 
12:38:19.104 [main] DEBUG org.reflections.Reflections - expanded subtype sub.types.test.A -> sub.types.test.C
12:38:19.104 [main] DEBUG org.reflections.Reflections - expanded subtype sub.types.test.A -> sub.types.test.B
A subclasses
[class sub.types.test.C, class com.dummy.D, class com.dummy.E, class sub.types.test.B, class com.dummy.F]
B subclasses
[class com.dummy.D, class com.dummy.F]

Это не 0 классов, а все наследующие классы. Надеюсь, это прояснит некоторые вопросы.

...