0

Let's say I have a sealed class A with B and C inheriting it.

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

Now, I have few classes in separate files in say classpath: com.dummy with inherits class B or C

class D : B(){}

class E : C(){}

class F : B(){}

Now, I want to scan all classes given the classpath and superclass type of the B or C, which is A.

Snippet that I am trying to achieve it but not working

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

This is returning 0 classes. If I change getSubTypesOf(B::class.java), then I am able to get all classes which inherited B.

timekeeper
  • 698
  • 15
  • 37

1 Answers1

0

I tested it accordingly to your description, and it works as expected:

The separate classpath:

package com.dummy

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

class D : B(){}

class E : C(){}

class F : B(){}

Sealed class and test:

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)
}

Console output:

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]

It's not 0 classes but all inheriting classes. I hope this clears some questions.

xinaiz
  • 7,744
  • 6
  • 34
  • 78