反射无法获取类类型

2022-09-03 02:32:08

我正在使用一个名为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

有谁知道如何解决这个原因,我被难住了?

提前致谢!


答案 1

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

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

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

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

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


答案 2

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

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


推荐