查找实现接口的 Java 类

2022-08-31 08:14:05

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

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


答案 1

不久前,我整理了一个包,用于做你想做的事情,甚至更多。(我需要它来做我正在写的实用程序)。它使用 ASM 库。您可以使用反射,但ASM的性能更好。

我把我的软件包放在我网站上的一个开源库中。图书馆在这里:http://software.clapper.org/javautil/。您希望从 with ClassFinder 类开始。

我为它编写的实用程序是一个RSS阅读器,我仍然每天使用它,因此代码确实倾向于得到执行。我使用ClassFinder来支持RSS阅读器中的插件API;在启动时,它会在几个目录树中查找包含实现某个接口的类的 jar 和类文件。它比您预期的要快得多。

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

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

更新:如果您使用的是Scala,您可能会发现这个库对Scala更友好。


答案 2

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

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 非常重要!您也可以在此处改用排除筛选器。

扫描仪可以在弹簧上下文罐中找到,注册表在弹簧豆中找到,类型过滤器在弹簧芯中找到。