Annotation is not inherited from interface method

前端 未结 3 1816
一个人的身影
一个人的身影 2021-01-17 12:27

I have an interface with an annotated method. The annotation is marked with @Inherited, so I expect an implementor to inherit it. However, it is not the case:

3条回答
  •  春和景丽
    2021-01-17 12:33

    Alternatively, you can use reflection to derive the same information. The method printMethodAnnotations can be rewritten as:

    private static void printMethodAnnotations(Method m) {
        Class methodDeclaredKlass = m.getDeclaringClass();
        List> interfases = org.apache.commons.lang3.ClassUtils.getAllInterfaces(methodDeclaredKlass);
        List annotations = new ArrayList<>();
        annotations.addAll(Arrays.asList(m.getAnnotations()));
        for (Class interfase : interfases) {
            for (Method interfaseMethod : interfase.getMethods()) {
                if (areMethodsEqual(interfaseMethod, m)) {
                    annotations.addAll(Arrays.asList(interfaseMethod.getAnnotations()));
                    continue;
                }
            }
        }
        System.out.println(m + "*: " + annotations);
    }
    
    private static boolean areMethodsEqual(Method m1, Method m2) {
        // return type, Modifiers are not required to check, if they are not appropriate match then it will be a compile
        // time error. This needs enhancements for Generic types parameter ?
        return m1.getName().equals(m2.getName()) && Arrays.equals(m1.getParameterTypes(), m2.getParameterTypes());
    }
    

提交回复
热议问题