Java反射库:在包中非递归地查找子类

3

给定以下代码片段:

Set<Class<? extends MyClass>> allClasses = 
  new Reflections("mypackage").getSubTypesOf(MyClass.class);

该库会递归搜索给定包及其子包中所有继承MyClass的类。我需要仅在给定包中执行此操作,即不在其子包中执行。是否有方法可以实现这样的要求?

2个回答

3
您可以使用输入过滤器(谓词)来避免扫描子包中的类型:
new Reflections(new ConfigurationBuilder().
    addUrls(ClasspathHelper.forPackage("my.pack")).
    filterInputsBy(new FilterBuilder().
        include("my\\.pack\\..*\\.class").
        exclude("my\\.pack\\..*\\..*\\.class")));

当然,您总可以对结果进行(发布)筛选,例如:
import static org.reflections.ReflectionUtils.*;

getAll(reflections.getSubTypesOf(A.class), 
    withPattern(".*my\\.pack\\.(?!.*\\..*).*")); //ouch...

我尝试了几种使用过滤器的组合,但我认为我发现了一个错误,阻止了这个功能的实用性。 - Giovanni Botta

1

这是暴力破解,但是:

1)获取MyClass的子类。放入一个集合中。

2)迭代集合中的类;移除属于其他包的类(即那些_someClass.getPackage().equals(MyClass.class.getPackage())为false的类)


我认为你没有理解这个问题。这与子类无关,而是与子包有关。 - Giovanni Botta
哦,抱歉——我读错了。但是,你仍然可以使用一种蛮力方法:迭代getSubTypesOf返回的所有类,并删除那些(_someClass.getPackage().equals(MyClass.class.getPackage())为false的类。 - Anna Dickinson
1
更新答案后我会接受。因为似乎在过滤器中发现了一个错误,我最终做了一些类似的事情。 - Giovanni Botta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接