Рука с вашим динамическим агентом JDK

Java задняя часть JVM MyBatis
Рука с вашим динамическим агентом JDK

В области 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