Ответ
Нет, методы, вызываемые на объекте, созданном с помощью java.lang.reflect.Proxy, не являются статическими. Proxy создает динамическую реализацию интерфейса во время выполнения, и все вызовы методов на этом прокси-объекте перенаправляются в InvocationHandler. Эти вызовы — это обычные вызовы методов экземпляра.
Как это работает:
- Создается прокси-объект, реализующий указанный набор интерфейсов.
- При вызове любого метода на этом прокси срабатывает метод
invoke()у связанногоInvocationHandler. 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...
Ключевой вывод: Прокси — это обертка над экземпляром объекта (или логикой), а не механизм для вызова статических методов.