Ответ
CGLib (Code Generation Library) — это библиотека для генерации байт-кода во время выполнения. Её работа и возможности зависят от нескольких ключевых факторов:
- Версия и реализация JVM: CGLib использует внутренние API (например,
sun.misc.Unsafe), которые могут меняться между версиями Java, что требует обновления библиотеки. - Архитектурные ограничения:
- Final-классы и методы: CGLib не может создать прокси для
final-классов или переопределитьfinal-методы. - Конструктор: Целевой класс должен иметь конструктор по умолчанию (без аргументов), так как CGLib создаёт подкласс, который вызывает
super().
- Final-классы и методы: CGLib не может создать прокси для
- Настройки JVM: Некоторые опции (например,
-XX:+UseFastAccessorMethods) могут влиять на производительность сгенерированных методов. - Альтернатива 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();
}
}