От каких факторов зависит работа библиотеки CGLib?

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

Ответ

CGLib (Code Generation Library) — это библиотека для генерации байт-кода во время выполнения. Её работа и возможности зависят от нескольких ключевых факторов:

  1. Версия и реализация JVM: CGLib использует внутренние API (например, sun.misc.Unsafe), которые могут меняться между версиями Java, что требует обновления библиотеки.
  2. Архитектурные ограничения:
    • Final-классы и методы: CGLib не может создать прокси для final-классов или переопределить final-методы.
    • Конструктор: Целевой класс должен иметь конструктор по умолчанию (без аргументов), так как CGLib создаёт подкласс, который вызывает super().
  3. Настройки JVM: Некоторые опции (например, -XX:+UseFastAccessorMethods) могут влиять на производительность сгенерированных методов.
  4. Альтернатива JDK Dynamic Proxy: В отличие от стандартного java.lang.reflect.Proxy, который работает только с интерфейсами, CGLib работает с обычными классами, создавая подкласс.

Пример создания прокси:

import net.sf.cglib.proxy.*;

class MyService {
    public void process() {
        System.out.println("Processing...");
    }
}

public class CglibDemo {
    public static void main(String[] args) {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(MyService.class); // Указываем целевой класс
        enhancer.setCallback((MethodInterceptor) (obj, method, args1, proxy) -> {
            System.out.println("Before: " + method.getName());
            Object result = proxy.invokeSuper(obj, args1); // Вызов оригинального метода
            System.out.println("After: " + method.getName());
            return result;
        });

        MyService proxy = (MyService) enhancer.create(); // Создание прокси-объекта
        proxy.process();
    }
}