В области Java широко используются динамические прокси, особенно популярные фреймворки Spring/MyBatis. JDK сама реализует технологию динамического прокси, но требует, чтобы проксируемый класс реализовывал интерфейс, но cglib эффективно восполняет этот недостаток. Этот блог будет охватывать 2 темы:
Во-первых, принцип реализации динамического прокси JDK позволит вам изучить сущность динамического прокси;
Во-вторых, напишите свой собственный код для реализации динамического прокси JDK и создайте мир!
❈ Динамический прокси JDK ❈Сначала напишите пример, воспринимательно понимаю динамический агент ~
❈Бизнес-интерфейс:
interface
Класс реализации бизнеса:
interface impl
Класс бизнес-процессинга:
Handler
Тестовый класс:
test
результат операции:
результат ❈В динамическом прокси-сервере JDK задействованы следующие роли:
Бизнес-интерфейс Интерфейс, цель класса бизнес-реализации, класс обработки бизнес-процессов Handler, класс динамического прокси $Proxy0, сгенерированный JVM в памяти
❈ Схема динамического прокси:Настоящее лицо динамических прокси ❈Грубо говоря, процесс динамического прокси выглядит так:
Во-первых: Proxy генерирует класс прокси $Proxy0 через переданные ему параметры (interfaces/invocationHandler);
Второй: Proxy загружает файл байт-кода сгенерированного прокси-класса $Proxy0 через переданный ему параметр (ClassLoader);
❈Давайте посмотрим, как выглядит $Proxy0, сгенерированный в приведенном выше примере:
$Прокси0 ❈Во-первых, $Proxy реализует наш бизнес-интерфейс (Man), поэтому клиент, очевидно, может вызывать методы бизнес-интерфейса.
Во-вторых, обратите внимание, что $Proxy наследуется от Proxy и передает класс бизнес-обработки родительскому классу Proxy через конструктор для инициализации. (По сути можно посмотреть исходники, там есть защищенный InvocationHandler h; в Proxy)
❈Инициализация прокси
findObject
❈Очевидно, мы видим, как вызываются методы бизнес-интерфейса:
В конце концов, вызывается метод вызова класса бизнес-обработки обратного вызова (конкретный обработчик) для завершения вызова!
❈ Рукописный код для реализации динамического прокси JDK ❈Выше мы разобрали весь процесс вызова динамического прокси JDK, теперь реализуем его вручную!
❈Сначала посмотрите на картинку:
Рукописная реализация динамического прокси JDK
Пользовательский обработчик вызовов:
MyInvocationHandler
Реализуйте обработчик бизнес-процессов MyInvocationHandler:
MyHandler
Пользовательский загрузчик классов MyClassLoader:
MyClassLoader
❈Почему определить пользовательский класс загрузчика? Что оно делает?
Вы знаете, мы хотим написать JDK Dynamic Proxy, то мы будем генерировать динамический прокси-класс в памяти, так как мы его загрузим? В это время вы можете использовать пользовательский классный загрузчик, чтобы сделать это!
Приведенный выше код переписывает метод findClass для загрузки указанного файла байт-кода по указанному пути.
❈Настройте MyProxy:
MyProxy
❈Роль MyProxy эквивалентна прокси-серверу JDK. Что делает MyProxy?
Во-первых: метод построения класса динамического агента требуется для построения метода классов динамических агентов в соответствии с интерфейсом Interfaces. (На самом деле он использует отражение)
Второе: динамически сгенерированный прокси-класс (I.E. .java файлы) скомпилированные файлы кода байтов для генерации (i.e.Class файлов), затем используйте класс загрузчика для загрузки
Третье: после загрузки динамического прокси-класса механизм отражения используется для создания экземпляра с помощью метода построения, а при создании экземпляра инициализируется бизнес-обработчик.
❈ Взгляните на другие методы MyProxy:Метод компиляции
метод getMethodString
результат операцииДавайте посмотрим на сгенерированный $MyProxy0:
$MyProxy0
Хорошо, здесь принцип реализации и рукописный реализация динамического прокси всего JDK заканчивается. Вы ее узнали?
GoodBye My Friend~
Оригинальная ссылка: https://www.jianshu.com/p/58759fef38b8