Поиск Java-класса в пакете рекурсивно по имени - PullRequest
3 голосов
/ 01 июня 2011

Есть ли какой-нибудь простой, хорошо изученный способ поиска заданного класса по имени в пакете и, рекурсивно, во всех подпакетах этого пакета?

Т.е. с учетом существующих классов, таких каккак:

  • 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, которые решают эту задачу?

1 Ответ

5 голосов
/ 01 июня 2011

Бесстыдный плагин для моего собственного программного обеспечения OSS: https://bitbucket.org/stevevls/metapossum-scanner/wiki, доступно в maven central.

Типичные сценарии использования для этой библиотеки - для поиска вещей, таких как:

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.

Кроме того, изучение пакетов (пакетов) на самом деле сложно сделать правильно.Это не так просто, как может показаться на первый взгляд!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...