问题

这个问题在这里已有答案:

  • 如何在Java中以编程方式获取接口的所有实现列表? 9个答案

前段时间,我遇到了一段代码,它使用了一些标准的Java功能来定位实现给定接口的类。我知道函数隐藏在一些非逻辑位置,但它们可以用于其他类,因为包含的名称是隐含的。那时我不需要它,所以我忘了它,但现在我做了,我似乎无法再找到这些功能。哪些功能可以找到?

编辑:我不是在寻找任何IDE函数或任何东西,而是可以在Java应用程序中执行的东西。


#1 热门回答(58 赞)

不久之前,我整理了一个包,用于做你想做的事情,等等。 (我需要它用于我正在编写的实用程序)。它使用了ASMlibrary。你可以使用反射,但ASM表现更好。

我将我的包放在我网站上的开源库中。图书馆在这里:http://software.clapper.org/javautil/。你想从withClassFinderclass开始。

我编写的实用程序是一个RSS阅读器,我仍然每天使用它,所以代码确实倾向于运用。我使用ClassFinder来支持RSS阅读器中的插件API;在启动时,它在几个目录树中查找包含实现特定接口的类的jar和类文件。它比你想象的要快得多。

该库是BSD许可的,因此你可以安全地将其与你的代码捆绑在一起。来源可用。

如果这对你有用,请自己帮忙。

更新:如果你正在使用Scala,你可能会发现this library更适合Scala。


#2 热门回答(47 赞)

春天可以为你做到这一点......

BeanDefinitionRegistry bdr = new SimpleBeanDefinitionRegistry();
ClassPathBeanDefinitionScanner s = new ClassPathBeanDefinitionScanner(bdr);

TypeFilter tf = new AssignableTypeFilter(CLASS_YOU_WANT.class);
s.addIncludeFilter(tf);
s.scan("package.you.want1", "package.you.want2");       
String[] beans = bdr.getBeanDefinitionNames();

注:如果你想要正确的结果,TypeFilter很重要!你也可以在此处使用排除过滤器。

Scanner可以在spring-context jar中找到,spring-beans中的注册表,类型过滤器是spring-core。


#3 热门回答(25 赞)

我真的很喜欢reflections library这样做。

它提供了许多不同类型的扫描仪(getTypesAnnotatedWith,getSubTypesOf等),编写或扩展自己的扫描仪非常简单。


原文链接