Получить реальный объект класса для Spring bean - PullRequest
22 голосов
/ 18 февраля 2010

Я использую Spring для добавления бобов. И я использую некоторые аннотации для аннотирования методов бина (Безопасность, TransactionManagement, ExceptionHanling, Logging) Проблема:

Я хочу создать тест JUnit, чтобы проверить, не забыл ли я комментировать некоторые методы. Но Spring возвращает класс $ ProxyXXX без каких-либо комментариев к методам.

Method[] methods = logic.getClass().getMethods();

  for (Method method : methods) {
     Annotation[] annotations = method.getAnnotations();   // empty array!

Как получить аннотации для метода или получить объект реального класса?

P.S. Spring 2.5.6, JDKDynamicProxy (не CGLib)

Ответы [ 3 ]

27 голосов
/ 18 февраля 2010

Прокси на основе интерфейса Spring реализуют TargetClassAware.

17 голосов
/ 18 февраля 2010

Вы можете привести прокси-объект к объекту и классу, для которого он действует как прокси (см. TargetSource ):

Advised advised = (Advised) proxy;
Class<?> cls = advised.getTargetSource().getTargetClass();

Как правило, вы должны следовать принципам Spring и сохранятьполучить правильный класс настолько ненавязчивым, насколько это возможно.Это означает, что как можно меньше классов должно зависеть от API-интерфейсов Spring Framework (возможно, добавьте реализацию ClassLocator и SpringProxyClassLocator).

14 голосов
/ 23 июля 2015

Или вы можете просто позвонить: AopUtils.getTargetClass (java.lang.Object) Это static вызов метода.

...