Начиная с одного базового интерфейса Java, я хочу, чтобы другие могли прямо или косвенно расширять этот интерфейс и добавлять к нему свойства и поведение bean-компонента как систему плагинов.
Затем, во время выполнения , на компьютере пользователя я найду все эти интерфейсы и сгенерирую один большой класс, который реализует их все. Поля, необходимые для свойств компонента, будут сгенерированы автоматически, в то время как поведение, определенное в интерфейсах, будет реализовано как статические методы вспомогательного класса (созданного разработчиками плагинов), которые принимают соответствующий интерфейс в качестве первого параметра, поэтому реализация Метод интерфейса делегировал бы статический метод, передавая "this" в качестве первого параметра.
Это похоже на то, как Scala реализует свои черты.
Я вижу 3 способа сделать это:
- Используйте динамические прокси Java, основанные на рефлексии.
- Создайте исходный код в виде строки и скомпилируйте его во время выполнения.
- Используйте некоторую библиотеку манипулирования байт-кодом для генерации класса во время выполнения.
Вариант 1 является самым простым, но наименее эффективным, и поэтому я хочу лучшего решения. Вариант 2 даст мне эффективную реализацию, но довольно уродлив.
Хотя я видел несколько библиотек, которые могут выполнять вариант 3, все они, кажется, требуют, чтобы я сначала выучил язык ассемблера Java, что я считаю очень трудоемким занятием с небольшими преимуществами в конце.
Поскольку я не хочу изучать какой-либо ассемблер, JVM или какой-либо другой вариант, лучше всего подойдет вариант 2, или есть библиотеки, которые могут генерировать динамические прокси без меня, использующего ассемблер JVM?