void addClassAnnotation(final AnnotationInfo classAnnotation) { if (classAnnotations == null) { classAnnotations = new AnnotationInfoList(); } classAnnotations.add(classAnnotation); }
/** * Find the subset of the {@link AnnotationInfo} objects in this list for which the given filter predicate is * true. * * @param filter * The {@link AnnotationInfoFilter} to apply. * @return The subset of the {@link AnnotationInfo} objects in this list for which the given filter predicate is * true. */ public AnnotationInfoList filter(final AnnotationInfoFilter filter) { final AnnotationInfoList annotationInfoFiltered = new AnnotationInfoList(); for (final AnnotationInfo resource : this) { if (filter.accept(resource)) { annotationInfoFiltered.add(resource); } } return annotationInfoFiltered; }
/** Find the transitive closure of meta-annotations. */ private static void findMetaAnnotations(final AnnotationInfo ai, final AnnotationInfoList allAnnotationsOut, final Set<ClassInfo> visited) { final ClassInfo annotationClassInfo = ai.getClassInfo(); if (annotationClassInfo != null && annotationClassInfo.annotationInfo != null) { // Don't get in a cycle if (visited.add(annotationClassInfo)) { for (final AnnotationInfo metaAnnotationInfo : annotationClassInfo.annotationInfo) { final ClassInfo metaAnnotationClassInfo = metaAnnotationInfo.getClassInfo(); final String metaAnnotationClassName = metaAnnotationClassInfo.getName(); // Don't treat java.lang.annotation annotations as meta-annotations if (!metaAnnotationClassName.startsWith("java.lang.annotation.")) { // Add the meta-annotation to the transitive closure allAnnotationsOut.add(metaAnnotationInfo); // Recurse to meta-meta-annotation findMetaAnnotations(metaAnnotationInfo, allAnnotationsOut, visited); } } } } }
/** Add an annotation to this class. */ void addClassAnnotation(final AnnotationInfo classAnnotationInfo, final Map<String, ClassInfo> classNameToClassInfo) { final ClassInfo annotationClassInfo = getOrCreateClassInfo(classAnnotationInfo.getName(), ANNOTATION_CLASS_MODIFIER, classNameToClassInfo); if (this.annotationInfo == null) { this.annotationInfo = new AnnotationInfoList(2); } this.annotationInfo.add(classAnnotationInfo); this.addRelatedClass(RelType.CLASS_ANNOTATIONS, annotationClassInfo); annotationClassInfo.addRelatedClass(RelType.CLASSES_WITH_ANNOTATION, this); // Record use of @Inherited meta-annotation if (classAnnotationInfo.getName().equals(Inherited.class.getName())) { isInherited = true; } }
for (final AnnotationInfo dai : directAnnotationInfo) { directOrInheritedAnnotationClasses.add(dai.getClassInfo()); reachableAnnotationInfo.add(dai); findMetaAnnotations(dai, reachableAnnotationInfo, reachedAnnotationClasses); reachableAnnotationInfo.add(sai); final AnnotationInfoList reachableMetaAnnotationInfo = new AnnotationInfoList(2); findMetaAnnotations(sai, reachableMetaAnnotationInfo, reachedAnnotationClasses); reachableAnnotationInfo.add(rmai);