Полезность динамических прокси Java по сравнению с обычными proxies

Мне нужен совет, в каких сценариях динамический прокси окажется более полезным, чем обычный прокси.

Я приложил много усилий, чтобы научиться эффективно использовать динамические прокси. В этом вопросе отметим, что такие фреймворки, как AspectJ, могут выполнять практически все, что мы пытаемся достичь с помощью динамических прокси, или что, например, CGLIB может использоваться для устранения некоторых недостатков динамических прокси.

Примеры использования

  • Декораторы - например, выполнять регистрацию при вызове метода или кэшировать возвращаемые значения сложных операций
  • Поддерживать контракт - то есть, убедитесь, что параметры находятся в допустимом диапазоне, а типы возвращаемых значений соответствуют принятым значениям.
  • Адаптер - Где-то видел умную статью, описывающую, как это полезно. Однако я редко встречаю этот шаблон дизайна.

Остальные?

Преимущества динамического прокси.

  • Декоратор: регистрирует все вызовы методов, например,

public Object invoke(Object target, Method method, Object[] arguments) {
         System.out.println("before method " + method.getName());
         return method.invoke(obj, args);
     }
}

Шаблон декоратора определенно полезен, поскольку он разрешает побочные эффекты для всех методов прокси (хотя это поведение является книжным примером использования аспектов .. ).

  • Контракт: В отличие от обычного прокси, нам не нужно реализовывать полный интерфейс. Например,

public Object invoke(Object target, Method method, Object[] arguments) {
     if ("getValues".equals(method.getName()) {
         // check or transform parameters and/or return types, e.g., 
         return RangeUtils.validateResponse( method.invoke(obj, args) );
     }

     if ("getVersion".equals(method.getName()) {
         // another example with no delegation
         return 3;
     }
} 

контракт, с другой стороны, дает преимущество только в том, что исключает необходимость реализации полного интерфейса. Затем снова, рефакторинг проксированных методов молча аннулирует динамический прокси.

Заключение

Итак, я вижу здесь один реальный вариант использования и один сомнительный вариант использования. Каково ваше мнение?

14
задан Bozho 12 September 2010 в 19:18
поделиться