查找实现接口的 Java 类
前段时间,我遇到了一段代码,它使用一些标准的Java功能来定位实现给定接口的类。我知道这些函数隐藏在一些非逻辑的地方,但它们可以用于其他类,因为包名称暗示了这一点。那时候我不需要它,所以我忘记了它,但现在我做到了,我似乎再也找不到这些功能了。在哪里可以找到这些功能?
编辑:我不是在寻找任何IDE函数或任何东西,而是可以在Java应用程序中执行的东西。
前段时间,我遇到了一段代码,它使用一些标准的Java功能来定位实现给定接口的类。我知道这些函数隐藏在一些非逻辑的地方,但它们可以用于其他类,因为包名称暗示了这一点。那时候我不需要它,所以我忘记了它,但现在我做到了,我似乎再也找不到这些功能了。在哪里可以找到这些功能?
编辑:我不是在寻找任何IDE函数或任何东西,而是可以在Java应用程序中执行的东西。
不久前,我整理了一个包,用于做你想做的事情,甚至更多。(我需要它来做我正在写的实用程序)。它使用 ASM 库。您可以使用反射,但ASM的性能更好。
我把我的软件包放在我网站上的一个开源库中。图书馆在这里:http://software.clapper.org/javautil/。您希望从 with ClassFinder 类开始。
我为它编写的实用程序是一个RSS阅读器,我仍然每天使用它,因此代码确实倾向于得到执行。我使用ClassFinder来支持RSS阅读器中的插件API;在启动时,它会在几个目录树中查找包含实现某个接口的类的 jar 和类文件。它比您预期的要快得多。
该库是BSD许可的,因此您可以安全地将其与代码捆绑在一起。源可用。
如果这对你有用,请帮助自己。
更新:如果您使用的是Scala,您可能会发现这个库对Scala更友好。
春天可以为你做到这一点...
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 非常重要!您也可以在此处改用排除筛选器。
扫描仪可以在弹簧上下文罐中找到,注册表在弹簧豆中找到,类型过滤器在弹簧芯中找到。