28

我正在使用 Spring 注入 bean。我正在使用一些注释来注释 bean 方法(Security、TransactionManagement、ExceptionHanling、Logging)。问题是:

我想创建 JUnit 测试来检查我是否忘记注释某些方法。但是 Spring 返回 $ProxyXXX 类,没有任何方法注释..

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

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

如何获取方法的注释或获取真实的类对象?

PS Spring 2.5.6,JDKDynamicProxy(不是 CGLib)

4

4 回答 4

32

Spring 的基于接口的代理实现TargetClassAware.

于 2010-02-18T14:42:47.080 回答
22

或者你可以直接调用:AopUtils.getTargetClass(java.lang.Object)这是一个static方法调用。

于 2015-07-23T19:06:37.930 回答
21

您可以转换代理对象以获取它充当代理的对象和类(请参阅TargetSource):

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

通常,您应该遵循 Spring 原则并尽可能不显眼地获取正确的类。这意味着尽可能少的类应该依赖于 Spring Framework API(可能添加一个 ClassLocator 和一个 SpringProxyClassLocator 实现)。

于 2010-02-18T14:41:49.100 回答
2

AopUtils.getTargetClass只展开一层。改为使用AopProxyUtils.ultimateTargetClass(instance)

(我知道这是一个已有 11 年历史的问题,但它在谷歌中仍然很高,所以它受益于新的答案)

于 2021-05-21T23:50:32.690 回答