Search code examples
javareflections

Reflections could not get class type


I am using a third party library called Reflections (not to be mistaken with Java reflection) to search another jar for Classes that extend Foo using the following code:

Reflections reflections = new Reflections("com.example");
for(Class<? extends Foo> e : reflections.getSubTypesOf(Foo.class)) {
    doSomething()
}

When I do this Reflections throws the following error:

org.reflections.ReflectionsException: could not get type for name com.example.ExtendsFoo

Does anyone know how to fix this cause I'm stumped?

Thanks in advance!


Solution

  • The problem may be due to not having a class loader that can resolve the name (even though it can resolve the subtype). This sounds contradictory, but I had the error message when I was building a Configuration and using ClasspathHelper.forClassLoader on an application- instantiated URLClassloader to figure out what to scan on the classpath, but not passing in said URLClassLoader into the Reflections configuration so that it could instantiate things correctly.

    So you may want to try something along the lines of the following:

    URLClassLoader urlcl = new URLClassLoader(urls);
    Reflections reflections = new Reflections(
      new ConfigurationBuilder().setUrls(
        ClasspathHelper.forClassLoader(urlcl)
      ).addClassLoader(urlcl)
    );
    

    where urls is an array of URLS to the jars containing the classes you want to load. I was getting the same error as you if I did not have the final addClassLoader(...) call to the ConfigurationBuilder.

    If this doesn't work, or is not applicable, it may be worth just setting a breakpoint in ReflectionsUtil.forName(String typeName, ClassLoader... classLoaders)) to see what is going on.