Ответ
В конструктор java.lang.reflect.Proxy передается не целевой объект, а реализация интерфейса InvocationHandler.
Механизм работы:
Proxy.newProxyInstance()создает динамический прокси-объект во время выполнения.- Конструктору (через фабричный метод) передается
InvocationHandler. 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, который инкапсулирует доступ к целевому объекту и логику перехвата.