Какой самый простой способ создать эффективную реализацию интерфейса Java во время выполнения? - PullRequest
2 голосов
/ 15 июля 2011

Начиная с одного базового интерфейса Java, я хочу, чтобы другие могли прямо или косвенно расширять этот интерфейс и добавлять к нему свойства и поведение bean-компонента как систему плагинов.

Затем, во время выполнения , на компьютере пользователя я найду все эти интерфейсы и сгенерирую один большой класс, который реализует их все. Поля, необходимые для свойств компонента, будут сгенерированы автоматически, в то время как поведение, определенное в интерфейсах, будет реализовано как статические методы вспомогательного класса (созданного разработчиками плагинов), которые принимают соответствующий интерфейс в качестве первого параметра, поэтому реализация Метод интерфейса делегировал бы статический метод, передавая "this" в качестве первого параметра.

Это похоже на то, как Scala реализует свои черты.

Я вижу 3 способа сделать это:

  1. Используйте динамические прокси Java, основанные на рефлексии.
  2. Создайте исходный код в виде строки и скомпилируйте его во время выполнения.
  3. Используйте некоторую библиотеку манипулирования байт-кодом для генерации класса во время выполнения.

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

Хотя я видел несколько библиотек, которые могут выполнять вариант 3, все они, кажется, требуют, чтобы я сначала выучил язык ассемблера Java, что я считаю очень трудоемким занятием с небольшими преимуществами в конце.

Поскольку я не хочу изучать какой-либо ассемблер, JVM или какой-либо другой вариант, лучше всего подойдет вариант 2, или есть библиотеки, которые могут генерировать динамические прокси без меня, использующего ассемблер JVM?

Ответы [ 2 ]

2 голосов
/ 15 июля 2011

Посмотрите на Javassist .С его помощью вы можете вносить изменения во время выполнения в классах, используя прямой API.Вам не нужно знать о "черной магии" Java, чтобы использовать ее.

1 голос
/ 15 июля 2011

При использовании BCEL вам не нужно знать Java-ассемблер.Lok на этот прокси .

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