获取Spring bean的真正Class对象

Pav*_*kin 23 java spring spring-aop

我使用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!
Run Code Online (Sandbox Code Playgroud)

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

PS Spring 2.5.6,JDKDynamicProxy(不是CGLib)

axt*_*avt 29

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

  • 真好!对不起,对于过时的评论,我使用了提供的链接中“另请参见”部分中的“ AopUtils.getTargetClass(Object)”。 (4认同)

Daf*_*aff 17

您可以强制转换代理对象以获取它作为代理的对象和类(请参阅TargetSource):

Advised advised = (Advised) proxy;
Class<?> cls = advised.getTargetSource().getTargetClass();
Run Code Online (Sandbox Code Playgroud)

一般来说,你应该遵循Spring的原则,并尽可能不引人注目地获得正确的课程.这意味着尽可能少的类应该依赖于Spring Framework API(可能添加一个ClassLocator和一个SpringProxyClassLocator实现).


kaq*_*qao 8

AopUtils.getTargetClass仅打开一层。AopProxyUtils.ultimateTargetClass(instance)代替使用。

(我知道这是一个 11 年前的问题,但它在 Google 中的排名仍然很高,因此它受益于新的答案)