从类中获取接口注释方法

时间:2016-01-26 13:06:40

标签: java spring reflection

我想通过反射访问Method。问题是Method在界面中注释:

public interface MyRepository extends CrudRepository<MyClass, Long> {

    @CustomAnnotation
    MyClass findByName(String name);
}

如您所见,我使用Spring提供了一个实现此Repository接口的类。 我想创建一个方法,它将获得一个Repository并调用所有使用@CustomAnnotation注释的方法。

public void do(Repository<?, ?> repository){
   Method[] methods=repository.getClass().getMethodThatAreAnnotatedInInterfaceWith(CustomAnnotation.class);
   ....
}

因为接口的实现不会出现接口的注释,所以我不知道如何查询这些方法。

4 个答案:

答案 0 :(得分:3)

由于您使用的是Spring,请使用AnnotationUtils#findAnnotation(Method method, Class<A> annotationType)

  

如果注释不直接出现在给定方法本身上,则在提供的方法上查找annotation注释,遍历其超级方法(即,从超类和接口)。

迭代getClass().get[Declared]Methods()的方法,并为每个方法检查是否使用上述实用程序使用注释进行注释。

答案 1 :(得分:2)

  1. 通过repository.getClass()获取超类的方法.getDeclaredMethod()。

  2. 通过repository.getClass()获取类的接口.getInterfaces()。

  3. 检查界面的方法是否有注释。

答案 2 :(得分:1)

获取方法层次结构的一种方法是使用Apache Commons Lang'sMethodUtils。如果您获得了方法的实现,那么您可以使用该类来获取(并检查)该方法的层次结构:

Set<Method> hierarchy = MethodUtils.getOverrideHierarchy( method, Interfaces.INCLUDE );

然后检查该层次结构中的方法以获取注释。

或者,您可以查看具有Reflections#getMethodsAnnotatedWith(SomeAnnotation.class)方法的前Google Reflections库。然后,您将使用返回的集来检查实际实现是否是声明这些方法的类/接口的实例。

答案 3 :(得分:0)

这是解决方案:

for (Class c : r.getClass().getInterfaces()) {
    for (Method m : c.getDeclaredMethods()) {
        if (m.getDeclaredAnnotation(CustomAnnotation.class) != null) {
            m.invoke(r, params);
        }
    }
}