Насколько мне известно, создание динамического прокси-сервера Java требует наличия интерфейса, с которым будет работать прокси. Тем не менее, Hibernate, похоже, управляет генерацией динамического прокси, не требуя записи интерфейсов для классов сущностей. Как оно работает? Единственная подсказка из документации Hibernate относится к тому факту, что классы должны иметь как минимум видимый для пакета конструктор для генерации прокси.
Выполняет ли Hibernate разработку байт-кода во время выполнения с помощью специального загрузчика классов? Документация предполагает, что это не так. Итак, как они создают свои прокси-оболочки вокруг конкретных объектов сущностей? Создают ли они просто прокси-сервер какого-то тривиального интерфейса, не заботясь о безопасности типов, а затем приводят его по желанию?




Начиная с Hibernate 3.3, поставщиком байт-кода по умолчанию теперь является Javassist, а не CGLib.
См. Подробности в классе javassist.util.proxy.ProxyFactory.
Hibernate использует поставщика байт-кода, настроенного в hibernate.properties, например:
hibernate.bytecode.provider=javassist