是否有一些简单,探索良好的方法可以在包中按名称搜索给定的类,并且递归地在此包的所有子包中搜索?
即。给定现有的类,例如:
foo.MyClass
foo.bar.baz.some.more.MyClass
foo.bar.baz.some.more.OtherClass
我希望运行类似magicMethod("foo.bar.baz", "MyClass")
的内容并获取Class foo.bar.baz.some.more.MyClass
作为结果。
显然,手动实现相当容易 - 通过从Package.getPackages()
探索加载的包,过滤任何合适的东西并使用Class.forName(...)
在循环中寻找类 - 但可能是标准Java库中有些东西或其他一些广泛的库,如Apache Commons,可以解决这个问题吗?
答案 0 :(得分:5)
我自己的OSS软件的无耻插件:https://bitbucket.org/stevevls/metapossum-scanner/wiki,可在maven中心使用。
这个库的典型用例是寻找像这样实现类的事情:
Set<Class<? extends MyDiscoverableHelper>> implementingClasses = new ClassesInPackageScanner()
.findImplementers("com.mypackage.service.impl", MyDiscoverableHelper.class);
或带注释的类:
Set<Class> entityClasses = new ClassesInPackageScanner()
.findAnnotatedClasses("com.mypackage.datamodel", javax.persistence.Entity.class);
但是可以通过实现接口并将其传递给扫描程序来换出选择策略。如果你要做的是按名称查找类,代码片段将如下所示:
Set<Class> entityClasses = new ClassesInPackageScanner().setResourceNameFilter(new ResourceNameFilter() {
public boolean acceptResourceName(java.lang.String packageName, java.lang.String fileName) {
return fileName.equals("MyClass.class");
}
}).scan("foo");
我刚刚写了这个库,因为我从未找到过我喜欢的用于探索包的实现。有许多库都有自己的内部API,但我所知道的并没有把它打包成一个漂亮的API。
另外,探索套餐实际上很难做到。它并不像最初看起来那么简单!