思考无法获得阶级类型

时间:2013-05-29 22:09:57

标签: java google-reflections

所以我使用Java Reflections API在另一个jar中搜索使用以下代码扩展Foo的类:

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

当我这样做时,Reflections会抛出以下错误:

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

有谁知道如何解决这个问题我很难过?

提前致谢!

3 个答案:

答案 0 :(得分:13)

问题可能是由于没有可以解析名称的类加载器(即使它可以解析子类型)。这听起来很矛盾,但是当我构建一个配置并在应用程序实例化的URLClassloader上使用ClasspathHelper.forClassLoader来确定要在类路径上扫描什么,但是没有将所述URLClassLoader传入Reflection配置时,我收到了错误消息。它可以正确地实例化。

所以你可能想尝试以下几点:

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

其中urls是包含要加载的类的jar的URLS数组。如果我没有对addClassLoader(...)进行最终ConfigurationBuilder调用,我会收到与您相同的错误。

如果这不起作用或不适用,可能只需在ReflectionsUtil.forName(String typeName, ClassLoader... classLoaders))中设置一个断点即可查看正在发生的事情。

答案 1 :(得分:3)

看看:https://code.google.com/p/reflections/issues/detail?id=163

Reflections(在其当前版本0.9.9-RC1中)不会正确地重新抛出异常。这就是为什么你可能会错过问题的真正原因。在我的情况下,它是一个损坏的.class文件,我的默认类加载器无法加载并抛出异常。所以,首先,尝试确保您的课程真正可以加载。

答案 2 :(得分:-3)

使用纯Java扫描类并不容易。

spring框架提供了一个名为ClassPathScanningCandidateComponentProvider的类,它可以满足您的需要。以下示例将在包org.example.package

中找到MyClass的所有子类
ClassPathScanningCandidateComponentProvider provider = new ClassPathScanningCandidateComponentProvider(true);
 provider.addIncludeFilter(new AssignableTypeFilter(MyClass.class));

// scan in org.example.package
 Set<BeanDefinition> components = provider.findCandidateComponents("org/example/package");
for (BeanDefinition component : components)
{

此方法的另一个好处是使用字节码分析器查找候选项,这意味着它不会加载它扫描的所有类。     class cls = Class.forName(component.getBeanClassName());     //使用找到的类cls }

更多信息请阅读link