Ответ 1
Предполагая, что вы хотите получить зарегистрированные службы на основе определенных значений свойств, вам необходимо использовать фильтр (который основан на LDAP).
Например:
int myport = 5000;
String filter = "&(objectClass=" + MyInterface.class.getName()
+ ")(port=" + myport + ")";
ServiceReference[] serviceReferences = bundleContext.getServiceReferences(null,filter);
где вы хотите искать службы как для реализации MyInterface
, так и для значения свойства port
, равного myport
.
Здесь - соответствующий javadoc для получения ссылок.
Примечание 1:
Приведенный выше пример и javadoc относятся к версии 4.2. Если вы не ограничены временем выполнения J2SE 1.4, я предлагаю вам взглянуть на синтаксис версии 4.3 где вы можете использовать дженерики.
Примечание 2: (любезно предоставлено Ray)
Вы также можете предварительно проверить правильность своего фильтра, создав Filter объект из строки filterStr
:
Filter filter = bundleContext.createFilter(filterStr);
который также позволяет сопоставлять фильтр с другими критериями. Вы все равно передаете filterStr
, чтобы получить ссылки, так как нет перегрузки, которая учитывает аргумент Filter
. Однако имейте в виду, что таким образом вы проверите правильность дважды: как getServiceReferences
, так и createFilter
throw InvalidSyntaxException
при разборе фильтра. Разумеется, я не думаю, что это неэффективность шоу-стопперов, но стоит упомянуть.