Java Dynamic Proxy была объяснена на API, подключенном к Java, поэтому я не буду писать его здесь. Что я понимаю:
Расширить функциональность конкретного метода в определенном интерфейсе, и это прокси. Прокси - это метод вызова через объект обработчика вызовов, связанный с экземпляром прокси.
Давайте посмотрим на это с примером:
интерфейс:
публичный интерфейс num {void show (); int getNum (); int getProduct (int x);} Класс реализации:
открытый класс mynum реализует num {@Override public int getNum () {return 3; } @Override public int getProduct (int x) {return x; } @Override public void show () {System.out.println ("Основной метод печатает номер 99"); }} Давайте сначала посмотрим, как метод вызова описан в API
То есть обработчик вызовов вызывает основополагающий метод, представляющий объект метода в объект класса реализации интерфейса.
Первый способ реализации прокси:
Public Class Numproxy {Private Object Num; // Создание объекта класса реализации интерфейса через метод конструктора public numproxy (объект num) {this.num = num; } public Object getNumbyProxy () {Object numProxy = proxy.newProxyInstance (num.getClass (). getClassLoader (), новый класс [] {num.class}, new InvocationHandl Массив параметров реальных методов*/ @Override (Integer) obj * 2; вернуть numproxy; }} Второй способ реализации прокси: внедрив интерфейс InvocationHandler
Public Class NumProxyImpl реализует vocationHandler {// здесь я конкретно построил тип интерфейса, и он не записан как объект частного num num; public numproxyimpl (num num) {this.num = num; } @Override public Object invoke (объект прокси, метод метода, Object [] args) бросает Throwable {Object obj = null; String methodname = method.getName (); if ("getProduct" .equals (methodname)) {System.out.println ("Proxy: getProduct () start"); obj = method.invoke (num, args); obj = (целое число) obj * 2; System.out.println ("Proxy: getProduct () end"); } else if ("show" .equals (methodname)) {system.out.println ("proxy: show () start"); obj = method.invoke (num, args); System.out.println ("Proxy: Show () End"); } вернуть obj; }} Тестовый код:
public Class Testnum {public static void main (string [] args) {// test numproxy np = new numproxy (new mynum ()); Num numproxy = (num) np.getnumbyproxy (); int x = numproxy.getProduct (2); System.out.println (x); numproxy.show (); System.out.println ("---------------------"); Numproxyimpl npi = new numproxyimpl (new mynum ()); Num numpro = (num) proxy.newproxyinstance (num.class.getclassloader (), новый класс [] {num.class}, npi); int n = numpro.getProduct (3); System.out.println (n); numpro.show (); }} Результаты консоли:
Второй метод немного запутался. Я не знаю, есть ли у вас это. То есть он называется методом Invoke в numproxyimpl, который не отображается, но он был выполнен. Да, давайте спустимся, чтобы увидеть это.
Если вы не хотите быть неприятным, просто помните об этом.
Например, процесс кодирования может использоваться для использования прокси и написать пример в следующий раз.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.