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