Являются ли методы, вызываемые на объекте Proxy в Java, статическими?

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

Ответ

Нет, методы, вызываемые на объекте, созданном с помощью java.lang.reflect.Proxy, не являются статическими. Proxy создает динамическую реализацию интерфейса во время выполнения, и все вызовы методов на этом прокси-объекте перенаправляются в InvocationHandler. Эти вызовы — это обычные вызовы методов экземпляра.

Как это работает:

  1. Создается прокси-объект, реализующий указанный набор интерфейсов.
  2. При вызове любого метода на этом прокси срабатывает метод invoke() у связанного InvocationHandler.
  3. InvocationHandler решает, как обработать вызов (например, делегировать реальному объекту, добавить логирование).

Пример создания и использования Proxy:

import java.lang.reflect.*;

interface Service {
    String performAction();
}

Service realService = () -> "Real Action";

Service proxyInstance = (Service) Proxy.newProxyInstance(
    Service.class.getClassLoader(),
    new Class[]{Service.class},
    new InvocationHandler() {
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            System.out.println("Proxy: Before method '" + method.getName() + "'");
            // Делегируем вызов реальному объекту
            Object result = method.invoke(realService, args);
            System.out.println("Proxy: After method '" + method.getName() + "'");
            return result;
        }
    }
);

// Вызов метода на прокси-объекте (не статический!)
String result = proxyInstance.performAction();
System.out.println(result); // Вывод: Proxy: Before... Real Action Proxy: After...

Ключевой вывод: Прокси — это обертка над экземпляром объекта (или логикой), а не механизм для вызова статических методов.