按名称递归搜索包中的Java类

Gre*_*Cat 3 java reflection

是否有一些简单,探索良好的方法来在包中按名称搜索给定的类,并且递归地在此包的所有子包中进行搜索?

即给出现有的类,例如:

  • 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)中有一些东西可以解决这个任务?

ste*_*vls 5

我自己的OSS软件的无耻插件:https://bitbucket.org/stevevls/metapossum-scanner/wiki,可在maven central中找到.

这个库的典型用例是寻找像这样实现类的操作:

Set<Class<? extends MyDiscoverableHelper>> implementingClasses = new ClassesInPackageScanner()
    .findImplementers("com.mypackage.service.impl", MyDiscoverableHelper.class);
Run Code Online (Sandbox Code Playgroud)

或注释类如下:

Set<Class> entityClasses = new ClassesInPackageScanner()
    .findAnnotatedClasses("com.mypackage.datamodel", javax.persistence.Entity.class);
Run Code Online (Sandbox Code Playgroud)

但是可以通过实现接口并将其传递给扫描仪来交换选择策略.如果你要做的是按名称查找类,代码片段将如下所示:

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");
Run Code Online (Sandbox Code Playgroud)

我刚才写了这个库,因为我从来没有找到过我喜欢的用于探索包的实现.有许多库都有自己的内部API,但我所知道的并没有把它打包成一个漂亮的API.

另外,探索套餐实际上很难做到.它并不像最初看起来那么简单!