Как избежать class.forName () в OSGi? - PullRequest
4 голосов
/ 07 июля 2011

Я относительно новичок в OSGi и в нашем отделе.переходит на OSGi Framework.У меня есть два пакета A и B. B зависит от A, поэтому я включил его в файл манифеста B как Import-Package: A.

Также у меня есть определенный класс в A, который использует отражение для доступа к определенномукласс из B. Класс в A использует class.forName (класс в B).Я хочу избавиться от этого отражения, так как это может вызвать проблемы при переходе на платформу OSGi.Как я могу избавиться от этого class.forName ()?

Спасибо!

Ответы [ 3 ]

4 голосов
/ 07 июля 2011

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

Итак, ваша ситуация такова, что пакет A нуждается в некотором экземпляре класса, который находится в комплектеB.Чтобы A понял смысл этого экземпляра, я предполагаю, что у него есть некоторый интерфейс, который он будет использовать для общения с экземпляром.Давайте сделаем это немного более конкретным.

/Bundle A
  /ThingyInterface.class

/Bundle B
  /ThingyImplementation.class (implements ThingyInterface.class)

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

  • A требуется ровно одна копия реализации.В этом случае зарегистрируйте Thingy в качестве службы.
  • A требуется несколько экземпляров реализации.В этом случае введите ThingyFactory в A и создайте реализацию этой фабрики в B, которую вы затем зарегистрируете как службу.

В любом случае вы разрешаете B выполняйте фактическую реализацию, у вас нет зависимости от A до B, и B не требует отражения для создания экземпляров объектов.

Короче говоря, службы - ваш друг.

0 голосов
/ 07 июля 2011

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

Или, возможно, вам нужен еще один пакет C, который содержит все классы, общие для A и B. Помните, что OSGiтам, чтобы помочь вам создать модули с чистыми интерфейсами.Если вы обнаружите, что вам не удается заставить что-то работать с OSGi, возможно, это связано с утечкой какой-то абстракции или с неправильной разработкой зависимости.

0 голосов
/ 07 июля 2011

На мой взгляд, два способа создания объектов в Java

  1. Вызовите конструктор новым
  2. использовать отражение

Так что, если вы хотите избежать рефлексии, вы можете импортировать только класс в пакете A, а затем экземпляр new () (для этого вам нужно ввести B в пакете A). Но так как пакет B alreadys зависит от A, это вызовет перекрестную зависимость, которая не разрешена в OSGi. Поэтому я рекомендую вам выполнить рефакторинг вашего класса, чтобы извлечь такой код из пакета A и перейти к пакету B.

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