17

我正在使用名为Reflections的第三方库(不要与 Java反射混淆)来搜索另一个 jar 以查找Foo 使用以下代码扩展的类:

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

当我这样做时,反射会引发以下错误:

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

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

提前致谢!

4

3 回答 3

14

问题可能是由于没有可以解析名称的类加载器(即使它可以解析子类型)。这听起来很矛盾,但是当我构建配置并ClasspathHelper.forClassLoader在应用程序实例化的 URLClassloader 上使用以找出要在类路径上扫描的内容时出现错误消息,但没有将所述 URLClassLoader 传递到反射配置中以便它可以实例化事物正确。

因此,您可能想尝试以下方法:

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

whereurls是包含要加载的类的 jar 的 URL 数组。如果我没有addClassLoader(...)ConfigurationBuilder.

如果这不起作用或不适用,则可能值得设置一个断点ReflectionsUtil.forName(String typeName, ClassLoader... classLoaders))以查看发生了什么。

于 2013-08-25T01:24:06.967 回答
3

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

反射(在其当前版本 0.9.9-RC1 中)不会正确地重新抛出异常。这就是为什么您可能会错过问题的真正原因。就我而言,这是一个损坏的.class文件,我的默认类加载器无法加载并引发异常。因此,首先,尝试确保您的类是真正可加载的。

于 2013-12-29T20:10:44.793 回答
-4

使用纯 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)
{

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

更多信息请阅读链接

于 2013-05-30T03:29:41.170 回答