Есть ли способ получить все классы, которые реализуют определенный метод? - PullRequest
1 голос
/ 24 декабря 2009

Название говорит само за себя. Язык Java.

Ответы [ 3 ]

5 голосов
/ 24 декабря 2009

Да, есть. Это, однако, утомительная и дорогая работа. Вам нужно пролистать все файлы классов и все файлы JAR с помощью ClassLoader#getResources() и снимка java.io.File и загрузить все его классы с помощью Class#forName() и, наконец, проверьте, существует ли метод, по Class#getMethod().

Однако, есть сторонние API, которые могут взять утомительную работу из рук, но это все еще дорого, потому что загрузка класса вызовет выполнение его static инициализаторов.

Более чистым способом является использование annotations и аннотирование соответствующих методов, а затем использование библиотек, которые ищут классы / методы / поля на основе аннотаций, таких как Google Reflections .

С другой стороны, если полное имя пакета или имя файла JAR известно заранее, тогда работа будет менее утомительной и дорогой (не нужно делать что-либо рекурсивно или загружать все классы всего пути к классам) .

Обновление: Я помню, я когда-либо писал пример кода для достижения чего-то подобного, вы можете найти его здесь . Это хорошо для начала, вам нужно только немного изменить его, чтобы проверить метод.

4 голосов
/ 24 декабря 2009

Нет, вообще нельзя. Если бы вы могли получить полный список доступных классов, вы могли бы проверить каждый из них, используя отражение - но вы не можете попросить загрузчика классов получить список всего, что доступно. (Например, он может извлекать классы по HTTP и может знать не все доступные файлы.)

Если вы знали, что вас интересуют классы в файле jar, вы можете открыть файл jar, найти все файлы классов внутри него и запросить загрузчик классов для этих классов. Это было бы несколько неудобно.

Какая здесь картина в целом? Может быть, есть лучший способ подойти к проблеме.

2 голосов
/ 24 декабря 2009

Кроме того, в Eclipse вы можете просто попросить об этом:

Нажмите на метод и введите Ctrl-T .

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