Что такое библиотека CGLib и для чего она используется?

«Что такое библиотека CGLib и для чего она используется?» — вопрос из категории Spring, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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 методы, так как для них невозможно создать подкласс или переопределение.