Если вы используете LogService, вы все равно будете с ним связаны. Если вы пишете промежуточное программное обеспечение, вы, вероятно, получите параметризованное имя через какой-нибудь XML-файл или через API. И да, «LogService» ужасно потерпит неудачу, вам нужно использовать полное имя: «org.osgi.service.log.LogService». Основной причиной использования шаблона LogService.class.getName () является правильное переименование при рефакторинге кода и минимизация орфографических ошибок. Следующий OSGi API, скорее всего, будет иметь:
ServiceReference<S> getServiceReference(Class<S> type)
призывает повысить безопасность типов.
В любом случае, я бы никогда не использовал эти низкоуровневые API, если бы вы не разрабатывали промежуточное программное обеспечение. Если вы действительно зависите от конкретного класса, то DS бесконечно проще, и даже больше, когда вы используете его с аннотациями bnd (http://enroute.osgi.org/doc/217-ds.html).
@Component
class Xyz implements SomeService {
LogService log;
@Reference
void setLog( LogService log) { this.log = log; }
public void foo() { ... someservice ... }
}
Если вы разрабатываете промежуточное программное обеспечение, вы получаете классы обслуживания, как правило, не зная фактического класса, через строку или объект класса. В этих случаях используется OSGi API, основанный на строках, потому что он позволяет нам быть более ленивым, не создавая загрузчик классов до последнего момента времени. Я думаю, что самая большая ошибка, которую мы сделали в OSGi 12 лет назад, заключается в том, чтобы не включать концепции DS в ядро ...: - (