Эта статья организует знания для динамических агентов Java, конкретный контент заключается в следующем
1. Dynamic Proxy Java (сравнительное официальное заявление)
Прокси -модель является обычно используемой моделью дизайна Java. Его характеристика заключается в том, что класс прокси и класс делегатов имеет одинаковый интерфейс. Класс прокси несет главным образом ответственность за предварительные сообщения, фильтрацию сообщений, пересылку сообщений в класс делегатов и обработку сообщений после события. Обычно существует связь между прокси -классом и классом делегатов. Объект прокси -класса связан с объектом класса делегатов. Сам объект класса прокси по -настоящему не реализует Сервис, но предоставляет конкретные услуги, вызывая соответствующие методы объекта класса делегата.
Согласно периоду создания агента, классы агентов можно разделить на два типа.
Статический прокси: создан программистами или автоматически генерирует исходный код с помощью конкретных инструментов и компилирует его. Перед запуском программы файл .class класса прокси уже существует.
Динамический прокси: он создается динамически с использованием механизма отражения при запуске программы.
2. Динамическая реализация прокси -сервера
java.lang.reflect.proxy,
Proxy предоставляет статические методы для создания динамических классов и экземпляров прокси.
NewProxyInstance ()
Возвращает экземпляр прокси -класса указанного интерфейса, который может назначить вызовы метода указанному обработчику вызовов.
2.1. Интерфейс DAO (обеспечивает моделируемый интерфейс уровня доступа данных)
Пакет javaproxy;/** Определите интерфейс уровня доступа к данным*/Публичный интерфейс DAO {// Моделируйте сохранение данных public void Said ();} 2.2. Класс реализации класса Daoimpl
Пакет Javaproxy; открытый класс daoimpl реализует dao {@override public void said said () {system.out.println ("выполнить метод сохранения ................"); }} 2.3. Класс обработки агента
Пакет Javaproxy; Импорт java.lang.reflect.invocationHandler; импортировать java.lang.reflect.method; открытый класс Daohandler реализует vocationhandler {private obj; public daohandler (Object obj) {this.obj = obj;} @Override public Object invoke (Proxy Object, метод метода, объект [] args) бросает Throwable {System.out.println («Делайте что-то перед методом»); // Предварительный method aop simude stemude neblectoke. args); System.out.println («Сделай что-нибудь после метода»); // Пост-метод AOP моделируется здесь возврат; }} 2.4. Клиентский звонок
Пакет Javaproxy; Импорт java.lang.reflect.proxy; public class client {public static void main (string [] args) {// metaobject (proxed object) daoimpl daoimpl = new daoimpl (); // Класс бизнес -прокси DAOHANDLER DAOHANDLER = новый DAOHANDLER (DAOIMPL); Dao dao = (dao) proxy.newproxyinstance (daoimpl .getClass (). GetClassloader (), daoimpl.getClass () .getInterfaces (), daOhandler); dao.save (); }}2. 5. Результаты
3. Симуляция реализации прокси в Mybatis
3.1. MapperProxy Class
Пакет javaproxy; импорт java.lang.reflect.invocationHandler; import java.lang.reflect.method; import java.lang.reflect.proxy; открытый класс mapperproxy реализует vlockationhandl @Param: метод выполнения с помощью sqlSession** @return: return Proxy объект*/ public static <t> t newmapperproxy (class <t> mapperinterface, object sqlsession) {classloader classloader = mapperinterface.getClassloader (); Class <?> [] Interfaces = new Class [] {mapperInterface}; Mapperproxy proxy = new MapperProxy (); return (t) proxy.newProxyInstance (ClassLoader, Interfaces, Proxy); } /* * (non-Javadoc) * * @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object, * java.lang.reflect.Method, java.lang.Object[]) * * @param: proxy object* * @param: method finds the corresponding method through the method name* * @param: pass the object into the object through the method to Найдите соответствующую карту параметров** @return: вернуть выполненный объект параметра*/ public Object Invoke (Прокси -прокси, метод метода, объект [] args) бросает Throwable {// Здесь соответствующая операция выполняется путем параметра соответствующего отображения с помощью имени метода и параметров System.out.println («выполнять фактический метод здесь»); вернуть ноль; }} 3.2. Клиент
Пакет Javaproxy; Импорт java.lang.reflect.proxy; Public Class Client {public static void main (string [] args) {dao dao = mapperproxy.newmapperproxy (dao.class, null); dao.save (); }}3.3. Результаты
Приведенное выше пример использования динамического прокси JDK. Я надеюсь, что для всех будет полезно изучать Java -программирование.