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



是否有一些简单、探索良好的方法可以在包中按名称搜索给定类,并递归地在该包的所有子包中搜索?

即给定现有类别,例如:

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

我自己的OSS软件的无耻插件:https://bitbucket.org/stevevls/metapossum-scanner/wiki,可在马文中心购买。

这个库的典型用例是做一些事情,比如寻找实现这样的类:

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中。

此外,探索软件包实际上很难做到正确。这并不像一开始看起来那么简单!

相关内容

  • 没有找到相关文章

最新更新