Во-первых, введение динамического агента
- Динамические и статические роли прокси-агента совпадают, режим статического прокси прокси-класс пишется впереди нас, и динамический прокси-класс генерируется динамически, на самом деле, суть статического и динамического прокси-агента, как, нужно запустить окончательную программу генерировать экземпляр прокси-объект, через который для расширения и завершить соответствующую бизнес-логику, но статического агента необходимо указать жестко и динамически генерировать эту реализацию динамической поддержки прокси во время выполнения. Очевидно, что преимущества динамически генерируемые во время кодирования, прокси-логика и бизнес-логика независимо друг от друга, не влияют друг, не навязчивый, там нет связи
Во-вторых, динамические прокси, связанные с двумя классами
- Интерфейс InvocationHandler: Этот интерфейс определяет только метод объект: вызов (объект Object, метод Method, Object [арг]). При фактическом использовании, первый параметр OBJ обычно относится прокси-класс, является метод прокси, параметр арг массив для этого метода. Этот абстрактный метод, реализованный в динамическом прокси-классе
- Прокси: Этот класс динамический прокси - класс, эффект аналогичен воплощению ProxySubject, который в основном включает в себя следующее содержание:
Защищенный прокси (из InvocationHandler ч): Конструктор, к внутренней оценке ч для задания.
Статический класс getProxyClass (ClassLoader погрузчик, класс [] интерфейсы): получение прокси - класса, в котором загрузчик классов является загрузчиком, массив всех интерфейсов интерфейса имеет реальный класс
В-третьих, код динамических агентов
1, аннотация роль
1 // абстрактная роль 2 публичного интерфейса пользователя { 3. 4. Общественность недействительных надстроек (); . 5 . 6 }
2, реальная роль
1 // истинные роли 2 общественного класса UserImpl орудия пользователем { 3. 4. Общественность недействительными добавить () { 5. System.out.println ( "Это способ добавить" ); 6 } . 7 . 8 }
3, интерфейсный объект динамически генерируемые прокси-класс
1 импорт java.lang.reflect.InvocationHandler; 2 импорт java.lang.reflect.Method; 3 импорта java.lang.reflect.Proxy; 4 5 общественный класс InvocationHandlerProxy реализует InvocationHandler { 6 7 частных пользователей пользователя; - 9 общественной недействительная SETUSER (пользователь Пользователя) { 10 это .user = пользователь; 11 } 12 13 // 动态生成代理类 14 общественных объектов getProxy () { 15 возвратаProxy.newProxyInstance ( это .getClass () getClassLoader () ,. 16 user.getClass () The getInterfaces () ,. этого ); . 17 } 18 19. // Прокси - сервер: прокси - класс 20 // Метод: вызов обработчика прокси - класс метод объекта 21 является общественный объект Invoke (прокси - объект, метод, метод Object [арг]) бросает на Throwable { 22 show1 (); 23 Объект Invoke = Method.invoke (Пользователь, арг); 24 Show2 (); 25 возврата Invoke; 26 } 27 28 общественности недействительными show1 () { 29 System.out.println ( "показать方法1" ); 30 } 31 32 общественных пустот show2 () { 33 System.out.println ( "показать方法2" ); 34 } 35 }
[Примечание] InvocationHandler руководство пакет
4, тест
1 public class Test { 2 public static void main(String[] args) { 3 4 UserImpl userImpl = new UserImpl(); 5 6 InvocationHandlerProxy ihp = new InvocationHandlerProxy(); 7 ihp.setUser(userImpl); 8 9 User proxy = (User) ihp.getProxy(); 10 11 proxy.add(); 12 } 13 }
5,运行结果
四,总结
动态代理的好处
- 可以使真实角色更加纯粹,不用去关注一些公共的事情
- 公共的业务由代理来完成,实现业务的分工
- 公共业务的要扩展的话,可以更加集中和方便
- 一个动态代理,一般代理一类的业务,一个动态代理可以代理多个类,代理接口