Как работает Java Dynamic Proxy?

Я понимаю, как использовать Dynamic Proxies в Java, но я не понимаю, как виртуальная машина фактически создает динамический прокси. Он генерирует байт-код и загружает его? Или что-то другое? Спасибо.

Ответ 1

По крайней мере, для реализации Sun, если вы посмотрите на исходный код java.lang.reflect.Proxy, вы увидите, что да, он генерирует байт-код "на лету" (используя класс sun.misc.ProxyGenerator).

Ответ 2

Я предлагаю вам читать Динамические прокси-классы:

Возвращает метод Proxy.getProxyClass объект java.lang.Class для прокси-сервера класс, заданный загрузчиком классов, и массив интерфейсов. Прокси-класс будут определены в указанном классе погрузчика и будет выполнять все поставляемых интерфейсов. Если прокси-класс для той же перестановки интерфейсов уже определен в классе загрузчик, то существующий прокси-класс будут возвращены; в противном случае, прокси класс для этих интерфейсов будет генерируется динамически и определяется в загрузчик классов. [акцент мой]

Ответ 3

Прокси-класс генерируется на лету (следовательно, динамический прокси-сервер) и загружается загрузчиком классов. Поэтому, если вы отлаживаете приложения, использующие прокси JDK, вы увидите группу классов с именем ' com.sun.proxy. $ Proxy0 '.

Чтобы проверить мою теорию, вы можете использовать пример из динамических прокси-классов вместе с параметром VM -verbose: класс, который сообщит вам загруженные классы загрузчиком классов, и вы должны заметить * com.sun.proxy. $ Proxy0 *.