我正在使用 Reflections API 来扫描我的 java 项目并获取所有具有特定注释的类/接口。但是它只是返回类而不是接口。
我正在使用以下内容:
Set<Class<?>> annotated =
reflections.getTypesAnnotatedWith(Path.class);
注意:它适用于具有路径注释的类。
那么Reflections不支持扫描接口吗?还是我必须编写其他代码?
我正在使用 Reflections API 来扫描我的 java 项目并获取所有具有特定注释的类/接口。但是它只是返回类而不是接口。
我正在使用以下内容:
Set<Class<?>> annotated =
reflections.getTypesAnnotatedWith(Path.class);
注意:它适用于具有路径注释的类。
那么Reflections不支持扫描接口吗?还是我必须编写其他代码?
你可以试试这个:
@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();
}
}
}
这应该可以工作,可以在这里看到
也许您没有扫描所有相关的网址?在这种情况下,请尝试正确构建 Reflections 对象(使用 ClasspathHelper.forClasspath() 会扫描所有内容,尽管它可能过于宽泛......)