Quiero acceder al método a través de la reflexión. El problema es que el método está anotado en una interfaz:

public interface MyRepository extends CrudRepository<MyClass, Long> {

    @CustomAnnotation
    MyClass findByName(String name);
}

Como puede ver, uso Spring, que proporciona una clase que implementará esta interfaz de repositorio. Quiero crear un método, que obtendrá un Repositorio e invocará todos los métodos que están anotados con @CustomAnnotation.

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

Debido a que la implementación de una interfaz no tendrá las anotaciones de la interfaz presentes, no sé cómo consultar estos métodos.

4
user3046582 26 ene. 2016 a las 16:06

4 respuestas

La mejor respuesta

Ya que está utilizando Spring, use AnnotationUtils#findAnnotation(Method method, Class<A> annotationType):

Busque una única anotación de annotationType en el método proporcionado, atravesando sus supermétodos (es decir, desde superclases e interfaces) si la anotación no está directamente presente en el método dado.

Repita los métodos de getClass().get[Declared]Methods() y para cada uno de ellos verifique si está anotado con su anotación usando la utilidad anterior.

3
Adam Michalik 26 ene. 2016 a las 13:26

Aquí está la solución:

for (Class c : r.getClass().getInterfaces()) {
    for (Method m : c.getDeclaredMethods()) {
        if (m.getDeclaredAnnotation(CustomAnnotation.class) != null) {
            m.invoke(r, params);
        }
    }
}
0
Eldar Budagov 26 ene. 2016 a las 13:18

Una forma de obtener la jerarquía de un método sería utilizar la clase de Apache Commons Lang {{X0 }}. Siempre que obtenga la implementación de un método, puede usar esa clase para obtener (y verificar) la jerarquía de ese método:

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

Luego, verifique los métodos en esa jerarquía para la anotación.

Alternativamente, puede consultar la biblioteca anterior de Google Reflections que tiene el método Reflections#getMethodsAnnotatedWith(SomeAnnotation.class). Luego, usaría el conjunto devuelto para verificar si la implementación real es una instancia de la clase / interfaz que declara esos métodos.

1
Thomas 26 ene. 2016 a las 13:22
  1. Obtenga el método de la superclase por repository.getClass (). GetDeclaredMethod ().

  2. Obtenga la interfaz de la clase por repository.getClass (). GetInterfaces ().

  3. Verifique el método de interfaz si tiene la anotación.

2
Erick G. Hagstrom 26 ene. 2016 a las 13:12