Как найти все реализации определенного интерфейса? - PullRequest
2 голосов
/ 31 октября 2010

Я хочу сделать мою инициализацию программы немного «умнее».

У меня есть несколько классов, которые представляют команды.Все эти классы являются неизменяемыми (т.е. создания только одного экземпляра каждого должно быть достаточно для всего приложения).Все эти классы реализуют интерфейс Command.

Я думаю, что тот факт, что некоторые классы размещены в одном банке с классом с методом main (может быть, даже в 1 предопределенном пакете) и что эти классы реализуют один известный интерфейс, должен дать достаточно информации, чтобы сделать егоМожно автоматизировать создание своих экземпляров.

Как я могу реализовать эту функцию?(Очевидно, что это что-то тесно связано с отражением, и, возможно, с механизмами загрузки классов Java, но я не эксперт в этих областях).


Я хочу иметь что-то вроде этого:

public static void init() {
   ...
   Map<String, Command> commands = Maps.newHashMap();
   for (Class clazz : findCommandImplementationsInThisJarFile()) {
        //some try/catch stuff is ommited
        Command command = clazz.newInstance();
        commands.put(command.getName(), command);
   }
   ...
}

Как реализовать хитрый метод findCommandImplementationsInThisJarFile()?

1 Ответ

2 голосов
/ 31 октября 2010

Вам нужны extcos:

select(javaClasses()).from("your.package").returning(allAnnotatedWith(YourAnnotation.class))

Также поддерживает те, которые реализуются и расширяются и т.д. ...

См .: http://sourceforge.net/projects/extcos/

Spring такжесодержит аналогичный код для сканирования компонентов, который легко адаптируется.

...