В Java существуют следующие виды прокси:
Статические (Static Proxy): Реализуется путем создания отдельного класса-обертки, который содержит ссылку на реальный объект и делегирует ему вызовы методов, при этом добавляя собственную логику (например, логгирование, авторизацию).
java
Динамические (Dynamic Proxy): Создаются во время выполнения с использованием Reflection API и требуют, чтобы проксируемый объект реализовывал хотя бы один интерфейс. Позволяют генерировать прокси для множества классов, реализующих один интерфейс, без создания отдельного класса для каждого.
java
CGLIB Proxy: Основан на генерации байткода и не требует реализации интерфейса. Может проксировать конкретные классы (если они не финальные и методы не финальные). Более производительный, чем стандартный динамический прокси в некоторых сценариях.
java
Основные различия:
| Вид Прокси | Требует Интерфейс | Генерация | Гибкость | Производительность | Применение |
|---|---|---|---|---|---|
| Статический | Да | Вручную | Низкая (для каждого класса) | Высокая | Простые случаи, когда структура известна |
| Динамический | Да | Во время выполнения | Высокая (для интерфейсов) | Средняя | Общая логика для интерфейсов, АОП |
| CGLIB | Нет | Во время выполнения | Высокая (для классов) | Высокая | АОП, проксирование классов без интерфейсов |