API Reflections не показывает интерфейсы с аннотациями

Я использую Reflections API для сканирования моего Java-проекта и извлечения всех классов / интерфейсов с определенной аннотацией. Однако это просто возврат классов, а не интерфейсов.

Я использую следующее:

Set<Class<?>> annotated = 
    reflections.getTypesAnnotatedWith(Path.class);

Примечание: это работает для классов, имеющих аннотацию Path.

Так что, Reflections не поддерживает сканирование интерфейсов? Или я должен кодировать что-то еще?

2 ответа

Решение

Это должно работать, как можно увидеть здесь

Может быть, вы не сканируете все соответствующие URL-адреса? В этом случае попробуйте правильно построить объект Reflections (использование ClasspathHelper.forClasspath() будет сканировать все, хотя, возможно, он слишком широкий...)

Вы можете попробовать это:

@Documented
@Target(ElementType.METHOD)
@Inherited
@Retention(RetentionPolicy.RUNTIME)
public @interface MethodInfo{
    String author() default "Kuntal";
    String date();
    int revision() default 1;
    String comments();
}


public class AnnotationExample {

    public static void main(String[] args) {
    }

    @Override
    @MethodInfo(author = "Kuntal", comments = "Main method", date = "Nov 17 2012", revision = 1)
    public String toString() {
        return "Overriden toString method";
    }

    @Deprecated
    @MethodInfo(comments = "deprecated method", date = "Nov 17 2012")
    public static void oldMethod() {
        System.out.println("old method, don't use it.");
    }

    @SuppressWarnings({ "unchecked", "deprecation" })
    @MethodInfo(author = "Kuntal", comments = "Main method", date = "Nov 17 2012", revision = 10)
    public static void genericsTest() throws FileNotFoundException {
        List l = new ArrayList();
        l.add("abc");
        oldMethod();
    }

}

Затем вы можете использовать Reflection для анализа аннотаций Java из класса. Обратите внимание, что политика хранения аннотаций должна быть RUNTIME, иначе ее информация не будет доступна во время выполнения, и мы не сможем извлечь из нее какие-либо данные.

public class AnnotationParsing {

    public static void main(String[] args) {
        try {
            for (Method method : AnnotationParsing.class
                    .getClassLoader()
                    .loadClass(("com.kuntal.annotations.AnnotationExample"))
                    .getMethods()) {
                // checks if MethodInfo annotation is present for the method
                if (method
                        .isAnnotationPresent(com.kuntal.annotations.MethodInfo.class)) {
                    try {
                        // iterates all the annotations available in the method
                        for (Annotation anno : method.getDeclaredAnnotations()) {
                            System.out.println("Annotation in Method '"
                                    + method + "' : " + anno);
                        }
                        MethodInfo methodAnno = method
                                .getAnnotation(MethodInfo.class);
                        if (methodAnno.revision() == 1) {
                            System.out.println("Method with revision no 1 = "
                                    + method);
                        }

                    } catch (Throwable ex) {
                        ex.printStackTrace();
                    }
                }
            }
        } catch (SecurityException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

}
Другие вопросы по тегам