2013-06-26 5 views
0

У нас есть часть функциональности, упакованная во внешнюю библиотеку, и она привязана к нашему проекту. Эта библиотека никак не может быть изменена. Среди других есть два класса, лежащих внутри него: com.myorg.Grandpa и com.myorg.Dad, который распространяется на com.myorg.Grandpa. Также есть com.myorg.Grandson, простирающийся com.myorg.Dad и несколько других классов за пределами библиотеки, простирающейся com.myorg.Grandpa.Сделать класс Java выше приоритета компиляции, чем один внутри библиотеки в IDEA

Я декомпилирую com.myorg.Grandpa класс и добавлю новый метод new_method(). Затем я пытаюсь использовать new_method() в com.myorg.Grandson, но IDEA не позволит мне сделать это, потому что внук расширяет папу, который расширяет дедушку библиотеки, которая не содержит new_method(). Я попытался удалить дедушку из библиотеки, и на удивление ИДЕЯ не произнесла ни слова и успешно скомпилировала проект, несмотря на то, что в границах библиотеки Dad расширяет не существующий класс.

Вопрос в том, как заставить Папу продлить новый дедушка без удаления его внутри библиотеки?

+0

OT: Ваша модель кажется немного странной. Папа - это «дедушка, а потом внук» - это «папа». Это действительно ваше намерение? – maba

ответ

0

Вы можете

  • Добавить абстрактный класс между Dad и GrandSon: Продлить Dad и добавить метод в классе к югу. Затем выведите GrandSon из этого подкласса.

  • Поместите экземпляр Dad в новый класс, и пусть ваша среда IDE создаст методы делегата для агрегированного экземпляра Dad. Снова добавим новый метод в новый класс.

Существует еще одна возможность:

  • Если вы должны изменить классы вместо используйте aspectj плести в коде: AspectJ изменяет байт-код (он не нужен исходный код) во время выполнения. Таким образом вы можете добавлять методы или поля.
0

Дело в том, что вы дублируете классы с полной подписью пакета, поэтому вы получите тот, который загружает загрузчик классов. Я знаю, что в Websphere вы можете настроить приоритеты загрузчика классов, но не можете сказать в своем случае.

В любом случае, почему бы просто не сделать это без декомпиляции? Вы подвергаете себя жесткой связи с внешней библиотекой и плохой практикой (возможно, вопросами авторского права) путем декомпиляции/настройки. Кроме того, если библиотека будет обновлена, у вас возникнут проблемы с восстановлением ваших настраиваемых классов.

Варианты:

Создайте свою собственную реализацию, например:

  1. создать интерфейс, который воспроизводит все методы дедушкой плюс, что вам нужно.

  2. Расширьте класс Grandpa и реализуйте добавленный метод из вашего интерфейса, все остальные методы останутся нетронутыми.

  3. Расширьте все другие расширяющие классы из собственной иерархии классов.

  4. Вместо того, чтобы использовать библиотеки общего класса, использовать интерфейс в качестве наименования

Таким образом, вы вроде создать свой собственный интерфейс к библиотеке, если она меняется, вы знаете, где внести изменения.

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

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

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

С уважением

0

Он должен появиться первый в загрузчик классов.

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

Смотрите также: http://www.jetbrains.com/idea/webhelp/configuring-module-dependencies-and-libraries.html

 Смежные вопросы

  • Нет связанных вопросов^_^