gpt4 book ai didi

java - java中有没有类似注解继承的东西?

转载 作者:IT老高 更新时间:2023-10-28 11:26:07 28 4
gpt4 key购买 nike

我正在探索注解并发现一些注解似乎在它们之间具有层次结构。

我正在使用注释在后台为卡片生成代码。有不同的卡片类型(因此不同的代码和注释),但它们之间有一些共同的元素,如名称。

@Target(value = {ElementType.TYPE})
public @interface Move extends Page{
String method1();
String method2();
}

这将是常见的注释:

@Target(value = {ElementType.TYPE})
public @interface Page{
String method3();
}

在上面的示例中,我希望 Move 继承方法 3,但我收到一条警告,指出扩展对注释无效。我试图让一个注释扩展一个公共(public)基础,但这不起作用。这甚至可能还是只是一个设计问题?

最佳答案

您可以使用基本注释而不是继承来注释您的注释。这是used in Spring framework .

举个例子

@Target(value = {ElementType.ANNOTATION_TYPE})
public @interface Vehicle {
}

@Target(value = {ElementType.TYPE})
@Vehicle
public @interface Car {
}

@Car
class Foo {
}

然后您可以使用 Spring's AnnotationUtils 检查一个类是否被 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还包含用于搜索方法和其他带注释元素的注释的其他方法。 Spring 类也足够强大,可以搜索桥接方法、代理和其他极端情况,尤其是在 Spring 中遇到的那些情况。

关于java - java中有没有类似注解继承的东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7761513/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com