Создайте динамический прокси для класса без конструктора без аргументов

Я хочу создать прокси для класса вместо интерфейса. Есть ответы, описывающие использование cglib или Javassist для этой цели (например, https://stackoverflow.com/a/4449998/) , но я столкнулся с проблемой, так как класс, в котором я заинтересован в проксировании, не имеет конструктора без аргументов, поэтому Enhancer.create() выдает исключение. Глядя на Javassist ProxyFactory javadoc, ему также нужны аргументы конструктора.

Очевидным обходным решением является поиск типов аргументов конструктора путем отражения и передачи массива нулей/0/и т.д. но это не сработает, если конструктор выдаст исключение.

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


person Alexey Romanov    schedule 23.05.2014    source источник


Ответы (1)


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

Бесстыдный плагин: если вы вообще ищете альтернативу javassist/cglib, которая все еще активно развивается, взгляните на мою библиотеку bytebuddy.net< /а>.

person Rafael Winterhalter    schedule 23.05.2014
comment
Итак, я создаю прокси-класс с помощью cglib/javassist/ByteBuddy, а затем создаю его экземпляр с помощью Objenesis? - person Alexey Romanov; 23.05.2014
comment
Да. Это то, что вы делаете. - person Rafael Winterhalter; 23.05.2014