是否有一些简单,探索良好的方法来在包中按名称搜索给定的类,并且递归地在此包的所有子包中进行搜索?
即给定现有的类,例如:
> 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,解决这个任务?
解决方法:
这个库的典型用例是寻找像这样实现类的操作:
Set> implementingClasses = new ClassesInPackageScanner()
.findImplementers("com.mypackage.service.impl", MyDiscoverableHelper.class);
或注释类如下:
Set entityClasses = new ClassesInPackageScanner()
.findAnnotatedClasses("com.mypackage.datamodel", javax.persistence.Entity.class);
但是可以通过实现接口并将其传递给扫描仪来交换选择策略.如果你要做的是按名称查找类,代码片段将如下所示:
Set 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.
另外,探索套餐实际上很难做到.它并不像最初看起来那么简单!
标签:java,reflection
来源: https://codeday.me/bug/20190903/1796879.html