Что передается в конструктор Proxy в Java?

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

Ответ

В конструктор java.lang.reflect.Proxy передается не целевой объект, а реализация интерфейса InvocationHandler.

Механизм работы:

  1. Proxy.newProxyInstance() создает динамический прокси-объект во время выполнения.
  2. Конструктору (через фабричный метод) передается InvocationHandler.
  3. InvocationHandler содержит логику перехвата вызовов и сам хранит ссылку на целевой объект (target).

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

import java.lang.reflect.*;

interface Service {
    String execute(String input);
}

class RealService implements Service {
    public String execute(String input) {
        return "Processed: " + input;
    }
}

// InvocationHandler хранит целевой объект
class LoggingHandler implements InvocationHandler {
    private final Object target; // Целевой объект

    public LoggingHandler(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("[LOG] Calling method: " + method.getName());
        // Вызов метода на реальном объекте
        Object result = method.invoke(target, args);
        System.out.println("[LOG] Method finished.");
        return result;
    }
}

// Создание прокси
public class Main {
    public static void main(String[] args) {
        Service realService = new RealService();
        InvocationHandler handler = new LoggingHandler(realService); // Целевой объект здесь

        Service proxy = (Service) Proxy.newProxyInstance(
                Service.class.getClassLoader(),
                new Class[]{Service.class}, // Интерфейсы прокси
                handler // Обработчик, а не целевой объект
        );

        proxy.execute("test"); // Вызов перехватывается handler
    }
}

Итог: Прокси получает InvocationHandler, который инкапсулирует доступ к целевому объекту и логику перехвата.