Динамические прокси -классы Java можно разделить на два типа.
Статический прокси: создан программистами или автоматически генерирует исходный код с помощью конкретных инструментов и компилирует его. Перед запуском программы файл .class класса прокси уже существует.
Динамический прокси: он создается динамически с использованием механизма отражения при запуске программы.
1. Во -первых, мы продемонстрируем динамический прокси Java.
Теперь у нас есть простой бизнес -интерфейс, в котором говорится:
Кода -копия выглядит следующим образом:
Пакет Testaop;
публичный интерфейс, говорящий {
Public void Sayshello (название строки);
Public void Talking (название строки);
}
Простой класс реализации, говорящий, следующим образом:
Кода -копия выглядит следующим образом:
Пакет Testaop;
публичный класс, говорящий, реализует, говоря {
@Override
public void sayshello (string name) {
// TODO Автогенерированный метод заглушка
System.out.println (имя + ": привет всем!");
}
@Override
public void talking (string name) {
// TODO Автогенерированный метод заглушка
System.out.println (имя + ": я имею в виду, мы должны усердно работать, чтобы построить гармоничное общество!");
}
}
Чего мы хотим достичь, так это динамически имплантировать обработку до и после того, как высказывать и говорить.
JDK Dynamic Proxy в основном использует два класса в пакете Java.Lang.Reflect: Proxy и InvocationHandler.
InvocationHandler-это интерфейс, который определяет логику перекрестного выреза, внедряя этот интерфейс и вызывает код целевого класса с помощью механизма отражения, динамически объединяет логику по перекрестному вырезанию и бизнес-логику.
Proxy использует InvocationHandler для динамического создания экземпляра, который соответствует определенному интерфейсу и генерирует прокси -объект целевого класса.
Следующим образом, мы создаем экземпляр vocationhandler:
Кода -копия выглядит следующим образом:
Пакет Testaop;
импортировать java.lang.reflect.invocationHandler;
импортировать java.lang.reflect.method;
открытый класс myInvocationHandler реализует vocationhandler {
Цель частного объекта;
MyInvocationHandler (объект цели) {
this.Target = target;
}
@Override
Public Object Invoke (объект прокси, метод метода, объект [] args)
бросает бросок {
// Выполнить перед целевым методом
System.out.println (« -
System.out.println («Пожалуйста, поговорите на сцене следующего человека!»);
// Целевой метод вызов
Объект obj = method.invoke (target, args);
// выполнить целевой метод после
System.out.println («Все аплодисменты и поддержка!»);
вернуть OBJ;
}
}
Вот тест:
Кода -копия выглядит следующим образом:
Пакет Testaop;
Импорт java.lang.reflect.proxy;
открытый класс jdkproxytest {
public static void main (string [] args) {
// целевая категория бизнеса, которую вы хотите получить
Сказать цель = новое высказывание ();
// сплетать целевой класс и класс поперечного обрезания вместе
MyInvocationHandler Handler = новый MyInvocationHandler (Target);
// Создать экземпляр прокси
Сказать прокси = (высказывание) Proxy.newProxyInstance (
target.getClass (). getClassloader (), // класс загрузчик целевого класса
target.getClass (). getInterfaces (), // интерфейсы целевого класса
обработчик); // Cross Cut Class
proxy.sayhello ("Xiao Ming");
proxy.talking ("xiaoli");
}
}
Операция заключается в следующем:
Кода -копия выглядит следующим образом:
-
Пожалуйста, поговорите на сцене следующего человека!
Сяо Мин: Всем привет!
Все аплодировали и поощрялись!
-
Пожалуйста, поговорите на сцене следующего человека!
Сяоли: Я имею в виду, мы должны усердно работать, чтобы построить гармоничное общество!
Все аплодировали и поощрялись!
Существует большое ограничение на использование динамического прокси JDK, что требует, чтобы целевой класс должен был реализовать интерфейс соответствующего метода, и он может создавать только прокси -экземпляры для интерфейса. В методе прокси -сервера NewProxyInstance в тестовом классе выше, что вторым параметром этого метода является интерфейс целевого класса. Если этот класс не реализует интерфейс, он зависит от динамического прокси -сервера CGLIB.
Cglib принимает очень базовую технологию Bytecode, которая может создать подкласс для класса и использовать методы перехвата метода в подклассе, чтобы перехватить все вызовы методов родительского класса и логику перекрестного вырезания в ситуации.
2. Далее мы продемонстрируем динамический прокси CGLIB.
Прежде всего, нам нужно направлять пакет.
Сначала мы создаем прокси -создатель cglibproxy:
Кода -копия выглядит следующим образом:
пакет testaop.cglib;
импортировать java.lang.reflect.method;
Импорт net.sf.cglib.proxy.enhancer;
Импорт net.sf.cglib.proxy.methodinterceptor;
Импорт net.sf.cglib.proxy.methodproxy;
открытый класс cglibproxy реализует MethodInterceptor {
Enhancer Enhancer = новый Enhancer ();
public Object getProxy (класс Clazz) {
// Установить подкласс для создания
Enhance.setSuperClass (Clazz);
Enhancer.SetCallback (это);
// Динамически создавать экземпляры подкласса с помощью технологии ByteCode
return Enhancer.create ();
}
@Override
Общедоступный объект перехват (объект obj, метод метода, объект [] args,
MethodProxy Proxy) бросает Throwable {
// TODO Автогенерированный метод заглушка
System.out.println (« -
System.out.println («Пожалуйста, поговорите на сцене следующего человека!»);
// Целевой метод вызов
Object result = proxy.invokesuper (obj, args);
// выполнить целевой метод после
System.out.println («Все аплодисменты и поддержка!»);
результат возврата;
}
}
Затем тест:
Кода -копия выглядит следующим образом:
пакет testaop.cglib;
Импорт testaop.saying;
Импорт testaop.sayingimpl;
открытый класс cglibproxytest {
public static void main (string [] args) {
Cglibproxy proxy = new cglibproxy ();
// Создать классы прокси, динамически генерируя подклассы
Сказать Target = (высказывание) proxy.getProxy (showingImpl.class);
target.sayhello ("xiao ming");
target.talking ("xiaoli");
}
}
Результат ничем не отличается от динамического прокси JDK.
Как динамический прокси, так и динамический прокси-сервер CGLIB-это улучшение времени выполнения, которые улучшаются путем имплантации межотровнного кода в классы прокси. В отличие от этого, аспект, который может имплантировать поперечный код в период компиляции с помощью специального компилятора.