所以我使用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
有谁知道如何解决这个问题我很难过?
提前致谢!
答案 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