Ek açıklamanıza miras yerine temel bir açıklama ekleyebilirsiniz. Bu, Spring çerçevesinde kullanılır .
Bir örnek vermek gerekirse
@Target(value = {ElementType.ANNOTATION_TYPE})
public @interface Vehicle {
}
@Target(value = {ElementType.TYPE})
@Vehicle
public @interface Car {
}
@Car
class Foo {
}
Daha sonra, Spring'in AnnotationUtils'iniVehicle
kullanarak bir sınıfa not verilip verilmediğini kontrol edebilirsiniz :
Vehicle vehicleAnnotation = AnnotationUtils.findAnnotation (Foo.class, Vehicle.class);
boolean isAnnotated = vehicleAnnotation != null;
Bu yöntem şu şekilde uygulanır:
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
ayrıca yöntemler ve diğer açıklamalı öğeler üzerindeki ek açıklamaları aramak için ek yöntemler içerir. Bahar sınıfı, özellikle Spring'de karşılaşılanlar olmak üzere, köprülü yöntemler, vekiller ve diğer önemli durumlarda arama yapacak kadar güçlüdür.