我想通过反射访问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);
....
}
因为接口的实现不会出现接口的注释,所以我不知道如何查询这些方法。
答案 0 :(得分:3)
由于您使用的是Spring,请使用AnnotationUtils#findAnnotation(Method method, Class<A> annotationType)
:
如果注释不直接出现在给定方法本身上,则在提供的方法上查找annotation注释,遍历其超级方法(即,从超类和接口)。
迭代getClass().get[Declared]Methods()
的方法,并为每个方法检查是否使用上述实用程序使用注释进行注释。
答案 1 :(得分:2)
通过repository.getClass()获取超类的方法.getDeclaredMethod()。
通过repository.getClass()获取类的接口.getInterfaces()。
检查界面的方法是否有注释。
答案 2 :(得分:1)
获取方法层次结构的一种方法是使用Apache Commons Lang's类MethodUtils
。如果您获得了方法的实现,那么您可以使用该类来获取(并检查)该方法的层次结构:
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);
}
}
}