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