Цикл каждого класса в пакете в Scala - PullRequest
6 голосов
/ 13 апреля 2011

Есть ли способ, которым я могу "перебрать" набор классов из указанного пакета в Scala?

Вариант использования - управление набором сервисов, унаследованных от признака BaseService, которые открываются по предоставленному имени в REST API. Класс Manager должен быть в состоянии предоставить список служб, а также проверить, существует ли предоставленная служба, и, если это так, создать экземпляр для выполнения перегруженной функции.

Моя мысль похожа на псевдокод:

for ( clazz <- com.demo.pkg ) {
    val service = Class.forName(clazz).newInstance
    registerService( service )
}

Вместо того, чтобы создавать экземпляры, статические методы для одноименного объекта для предоставления имени и описания службы могут быть лучше.

В Python это тривиально из-за dir (), а в PHP довольно просто из-за функций загрузчика классов, но я новичок в Scala.

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

Обновление:

Я принял ответ JPP ниже, но он прав, это слишком дорогой процесс для обычной операции. Поэтому мне нужно изменить свой подход. Вместо этого класс менеджера будет поддерживать статический список предложений службы. Хотя это и не идеально с точки зрения разработки, выигрыш в скорости выполнения, похоже, того стоит.

1 Ответ

4 голосов
/ 13 апреля 2011

В настоящее время (2.8.1 / 2.9) в Scala нет специальной системы отражения / самоанализа, но вы можете свободно использовать Java. В этом конкретном случае вы можете портировать один из методов, используемых на стороне Java, для вывода списка всех классов в пакете, например, как показано здесь (не забудьте выбрать версию в комментариях):

http://snippets.dzone.com/posts/show/4831

Этот метод на самом деле не использует отражение Java для поиска классов; вместо этого он в основном просматривает все ресурсы, доступные ClassLoader, и проверяет, какие из них .class файлы.

Я вижу несколько предостережений:

  • Как и в Java, вы можете видеть только классы, видимые для определенного загрузчика классов (это может быть проблемой, например, в приложениях OSGi)
  • Операция достаточно дорогая в Java и, тем более, в Scala, поскольку scalac генерирует множество дополнительных классов для всех анонимных функций, сгенерированных в вашем коде, которые могут быть значительным числом благодаря таким методам, как filter, map, flatMap и т. д. Вы можете попытаться отфильтровать их по имени.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...