使用java反射提取注释值?

时间:2014-01-22 11:19:32

标签: java spring reflection spring-aop java-ee-7

我有以下课程。

我在服务类中自动someDao@Autowired SomeDao someDao。 我将服务中的逻辑称为someDao.getName(2);

SomeServiceImpl.java

public class SomeServiceImpl{

@Autowired SomeDao someDao
//call dao methods using someDao
}

SomeDao.java

public  interface SomeDao{

 String getName(Int id);
}

SomeDaoImpl.java

public class SomeDaoImpl implements SomeDao{

 @CustomAnnotation("somevalue")
 public String getName(int id){
   //logic

  }


}

SomeAspect.java

@Around("execution(public * *(..)) && @annotation(com.mycompany.CustomAnnotation)")
    public Object procedeNext(ProceedingJoinPoint call) throws Throwable {

  //Access annotation value
        MethodSignature signature = (MethodSignature) call.getSignature();
        Method method = signature.getMethod();
        CustomAnnotation myAnnotation =   method.getAnnotation(CustomAnnotation.class);
        String name = myAnnotation.value();
            //here i am expecting name value "somevalue" but it is returning null


}

CustomAnnotation@Retention(RetentionPolicy.RUNTIME)

在上述方面,String name = myAnnotation.value();应该给我somevalue,但它会给null。有什么建议吗?但是,如果我在界面中保留@CustomAnnotation("somevalue"),那么它会给出价值。注释接口方法是否合适?

1 个答案:

答案 0 :(得分:3)

这是因为默认的spring APO代理从接口而不是类中获取方法。所以当方法调用是接口而不是类时。

您有多种选择:

1.要么将xml配置更改为<aop:config proxy-target-class="true">,它应该可以工作,因为代理将获取类而不是接口。如果你有几个xml aop配置,如果其中一个定位到目标类,那么所有这些都会做同样的事情,所以要小心。

2.或者你坚持使用默认值,然后将注释放在界面上。只要你小心注释,那就完全没问题。特别是如果你有交易。

3.可能有另一个使用方法调用的解决方案使用ClassUtils获取目标类来获取代理接口后面的类,但我并没有太多关注它。

希望这有帮助