Встречается на собеседованиях • сегодня

Можно ли сделать Proxy для обычного класса без использования Spring

Да, можно создать Proxy для обычного класса без Spring, используя стандартные средства Java: java.lang.reflect.Proxy (для интерфейсов) или библиотеки типа CGLIB/ByteBuddy (для классов без интерфейсов).

Пример с интерфейсом:

java
interface Service {
    void doWork();
}

class RealService implements Service {
    public void doWork() {
        System.out.println("Real work");
    }
}

Service proxy = (Service) Proxy.newProxyInstance(
Service.class.getClassLoader(),
new Class[]{Service.class},
(p, method, args) -> {
System.out.println("Before method");
Object result = method.invoke(new RealService(), args);
System.out.println("After method");
return result;
}
);

proxy.doWork(); // Вызовет логирование + реальный метод

text

Для классов без интерфейсов используйте CGLIB:  
```java
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(MyClass.class);
enhancer.setCallback((MethodInterceptor) (obj, method, args, proxy) -> {
    System.out.println("Before");
    Object result = proxy.invokeSuper(obj, args);
    System.out.println("After");
    return result;
});
MyClass proxy = (MyClass) enhancer.create();

Ограничения:

  • Proxy работает только с интерфейсами.
  • CGLIB требует пустого конструктора.
  • Оба подхода добавляют накладные расходы.
Sophi
Софи собрала все вопросы. Тренируйся и получай
офферы быстрее!
Попробовать бесплатноArrow

Следующий вопрос

Это единственный вопрос по вашему фильтру

как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы