2

我正在使用 Reflections API 来扫描我的 java 项目并获取所有具有特定注释的类/接口。但是它只是返回类而不是接口。

我正在使用以下内容:

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

注意:它适用于具有路径注释的类。

那么Reflections不支持扫描接口吗?还是我必须编写其他代码?

4

2 回答 2

0

你可以试试这个:

@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();
    }

}

然后,您可以使用反射来解析类中的 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();
        }
    }

}
于 2014-07-15T08:22:01.460 回答
0

这应该可以工作,可以在这里看到

也许您没有扫描所有相关的网址?在这种情况下,请尝试正确构建 Reflections 对象(使用 ClasspathHelper.forClasspath() 会扫描所有内容,尽管它可能过于宽泛......)

于 2014-07-16T10:37:44.023 回答