Как экземпляр прокси передает себя InvocationHandler?

вот сигнатура метода из класса Proxy:

Object java.lang.reflect.Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) throws IllegalArgumentException

Я проверяю исходный код newProxyInstance в Proxy Class, я не смог найти, где прокси-объект передает себя методу InvocationHandler.

public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable;

Кто-нибудь знает?

Спасибо


person skystar7    schedule 04.12.2012    source источник


Ответы (1)


Вы на крючке, чтобы предоставить ссылку с помощью обычных средств. Одним из распространенных шаблонов является создание конечной переменной для ссылки на цель и передача анонимной реализации InvocationTargetHandler методу Proxy.newProxyInstance следующим образом:

final Object myObject = /*initialize the proxy target*/;
final Object proxy = Proxy.newProxyInstance(
    classLoader,
    new Class[] { /*your interface(s)*/ }, 
    new InvocationTargetHandler() {
        public Object invoke(Object proxy, Method method, Object[] args) {
            return method.invoke(myObject, args);
        }
});

Этот пример — самый бессмысленный прокси в мире, потому что он исправляет все вызовы методов, ничего не делая, но вы можете заполнить InvocationTargetHandler всевозможными забавными вещами.

Иногда API кажется немного неуклюжим, потому что проксируемый объект не является частью контракта, но авторы JDK хотели предоставить возможность существования прокси-класса без поддержки конкретной реализации. Очень полезно, что они сделали это таким образом... фиктивные объекты в ваших модульных тестах - отличный пример.

person stevevls    schedule 04.12.2012
comment
Большое спасибо за ваш ответ, мой вопрос не в том, как передать прокси-объект в InvocationTargetHandler, мой вопрос в том, как прокси был передан в дизайне? следовательно, когда я вызываю proxy.getClass().getName() из метода вызова, я получаю то же имя класса экземпляра моего прокси. - person skystar7; 05.12.2012
comment
@skystar7 без проблем! поэтому, если я правильно понимаю, вы спрашиваете о байт-коде, который генерирует JRE, когда вы вызываете newProxyInstance. если вы углубитесь в код JRE, вы найдете класс с именем sun.misc.ProxyGenerator. этот парень генерирует байт-код для каждого класса прокси, который создает методы-заглушки для вызова вашего обработчика прокси. внутри этих методов-заглушек параметр proxy просто передается как this. - person stevevls; 05.12.2012