Компилировать код плагина в Java без тела родительского класса - PullRequest
1 голос
/ 19 мая 2011

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

Я не хочу усложнять процесс создания плагина,Есть ли способ компилировать код без знания абстрактного тела класса (только его методы)?

Заранее спасибо.

Ответы [ 5 ]

4 голосов
/ 19 мая 2011

Есть ли способ компилировать код без знания тела абстрактного класса (только его методы)?

Нет. Чтобы скомпилировать класс, объявленный как

* * 1010

вам нужно иметь B в исходном формате в исходном пути или в формате .class в пути к классам.

(Если для написания плагина достаточно знать только методы, звучит скорее, что вам нужен интерфейс, чем абстрактный класс.)

Я не хочу усложнять процесс создания плагина.

Предоставление скомпилированного файла .class B полностью несложно и, вероятно, является лучшей практикой в ​​этом сценарии.

На самом деле, иметь под рукой API через .jar-файл, содержащий соответствующие классы и интерфейсы, вероятно, стандарт.

Чтобы быть ясным:

  1. Возьмите классы, которые имеют отношение к разработке плагинов, скомпилируйте их и вставьте, скажем, pluginapi.jar
  2. Распространите .jar и сообщите разработчикам плагинов, что их плагины должны скомпилироваться, при условии pluginapi.jar
  3. Попросите разработчиков плагинов предоставить вам plugin.jar (не обязательно включая классы плагинов)
  4. В вашем приложении убедитесь, что классы API подключаемых модулей присутствуют, например, включив в них путь к классам.
  5. Загрузка классов плагинов.
2 голосов
/ 19 мая 2011

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

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

Вы можете поместить этот интерфейс (и все интерфейсы / классы, видимые для плагинов) в отдельный файл .jar. Таким образом, им нужен только этот jar-файл для компиляции плагина.

0 голосов
/ 19 мая 2011

В этих случаях сценарии Java могут быть очень полезны.Пусть ваши плагины написаны на Groovy, и коды могут быть легко загружены и запущены в вашей среде, что-то вроде этого http://groovy.codehaus.org/Embedding+Groovy

0 голосов
/ 19 мая 2011

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

0 голосов
/ 19 мая 2011

Вы можете просто предоставить jar-файл со всеми необходимыми java-файлами. Но помните, что после того, как вы опубликуете API, вы должны быть очень осторожны с его изменением.

...