आप अपने एनोटेशन को वंशानुक्रम के बजाय आधार एनोटेशन के साथ एनोटेट कर सकते हैं। इसका उपयोग स्प्रिंग फ्रेमवर्क में किया जाता है ।
एक उदाहरण देना है
@Target(value = {ElementType.ANNOTATION_TYPE})
public @interface Vehicle {
}
@Target(value = {ElementType.TYPE})
@Vehicle
public @interface Car {
}
@Car
class Foo {
}
आप तब जांच सकते हैं कि क्या किसी वर्ग को स्प्रिंग एनोटेशन यूटिल्स के Vehicle
उपयोग के साथ एनोटेट किया गया है :
Vehicle vehicleAnnotation = AnnotationUtils.findAnnotation (Foo.class, Vehicle.class);
boolean isAnnotated = vehicleAnnotation != null;
इस विधि को इस प्रकार लागू किया जाता है:
public static <A extends Annotation> A findAnnotation(Class<?> clazz, Class<A> annotationType) {
return findAnnotation(clazz, annotationType, new HashSet<Annotation>());
}
@SuppressWarnings("unchecked")
private static <A extends Annotation> A findAnnotation(Class<?> clazz, Class<A> annotationType, Set<Annotation> visited) {
try {
Annotation[] anns = clazz.getDeclaredAnnotations();
for (Annotation ann : anns) {
if (ann.annotationType() == annotationType) {
return (A) ann;
}
}
for (Annotation ann : anns) {
if (!isInJavaLangAnnotationPackage(ann) && visited.add(ann)) {
A annotation = findAnnotation(ann.annotationType(), annotationType, visited);
if (annotation != null) {
return annotation;
}
}
}
}
catch (Exception ex) {
handleIntrospectionFailure(clazz, ex);
return null;
}
for (Class<?> ifc : clazz.getInterfaces()) {
A annotation = findAnnotation(ifc, annotationType, visited);
if (annotation != null) {
return annotation;
}
}
Class<?> superclass = clazz.getSuperclass();
if (superclass == null || Object.class == superclass) {
return null;
}
return findAnnotation(superclass, annotationType, visited);
}
AnnotationUtils
तरीकों और अन्य एनोटेट तत्वों पर एनोटेशन की खोज के लिए अतिरिक्त तरीके भी शामिल हैं। स्प्रिंग क्लास भी शक्तिशाली तरीके से खोज करने के लिए काफी शक्तिशाली है, परदे के पीछे, और अन्य कोने-मामलों, विशेष रूप से स्प्रिंग में सामना करना पड़ा।