Ответ
CGLib (Code Generation Library) — это библиотека для генерации байт-кода и создания динамических прокси-классов во время выполнения (runtime). Ее ключевое отличие от стандартного java.lang.reflect.Proxy — она работает с обычными классами, а не только с интерфейсами.
Основное применение:
- AOP (Aspect-Oriented Programming) в Spring Framework для внедрения сквозной функциональности (транзакции, кэширование, логирование).
- Создание прокси для классов, не реализующих интерфейсы.
- Тестирование (мокирование).
Как работает? CGLib создает подкласс целевого класса и переопределяет его методы, добавляя необходимую логику (например, вызов advice).
Пример создания прокси с помощью CGLib:
import net.sf.cglib.proxy.*;
class UserService {
public void saveUser() {
System.out.println("Saving user...");
}
}
public class CglibDemo {
public static void main(String[] args) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(UserService.class); // Указываем целевой класс
enhancer.setCallback((MethodInterceptor) (obj, method, params, proxy) -> {
System.out.println("[CGLib Proxy] Before: " + method.getName());
Object result = proxy.invokeSuper(obj, params); // Вызов оригинального метода
System.out.println("[CGLib Proxy] After: " + method.getName());
return result;
});
UserService proxy = (UserService) enhancer.create(); // Создание прокси-объекта
proxy.saveUser();
// Вывод:
// [CGLib Proxy] Before: saveUser
// Saving user...
// [CGLib Proxy] After: saveUser
}
}
Ограничения: CGLib не может проксировать final классы и final/private/static методы, так как для них невозможно создать подкласс или переопределение.