java - 如何捕获泛型父类(super class)类型参数的注解?

标签 java generics annotations

使用 java 8 可以创建带有目标 ElementType.TYPE_USE 的注释。

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE_USE})
public @interface MyAnnotation {
}

此注解可以应用于传递给通用父类(super class)的类型,例如:

public class ClassA extends BaseClass<@MyAnnotation ClassB,@MyAnnotation ClassC>{
...
}

使用以下代码,我可以轻松地从 ClassA 的实例动态检索父类(super class) BaseClass 的类型参数列表。

ClassA instanceOfA = new ClassA();
...
Class classOfA = instanceOfA.getClass();
ParameterizedType type =  (ParameterizedType)classOfA.getGenericSuperclass();
Type[] types = type.getActualTypeArguments();

// types[0] --> ClassB
// types[1] --> ClassC

从那里,我试图找到一种方法来检索每个类型参数的注释,但没有成功。

有没有办法动态地(运行时)检索这些注释?谢谢

编辑: 额外的精度,我想支持以下用例:

public class ClassA extends BaseClass<@Annotation1 ClassB,@Annotation2 ClassC>{
...
}

public class ClassD extends BaseClass<@Annotation3 ClassB,@Annotation4 ClassC>{
...
}

在这个例子中,ClassB 在 ClassA 或 ClassD 的上下文中被不同地注释(对于 ClassC 也是一样)。

最佳答案

棘手的:

 import java.lang.reflect.*;

 AnnotatedType baseClassAt = classOfA.getAnnotatedSuperclass();
 assert (at instanceof AnnotatedParameterizedType);

 AnnotatedType[] aTypes = ((AnnotatedParameterizedType)baseClassAt)
     .getAnnotatedActualTypeArguments();
 assert aTypes.length == 2;

 MyAnnotation myAnno0 = aTypes[0].getAnnotation(MyAnnotation.class);
 MyAnnotation myAnno1 = aTypes[1].getAnnotation(MyAnnotation.class);

关于java - 如何捕获泛型父类(super class)类型参数的注解?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32495517/

相关文章:

java - 如何确定特定类型的移动客户端是否正在访问我的 Web 应用程序?

java - 什么正在终止我的 Java ExecutorService

c# - 创建参数类型的对象

C#-泛型类中的数组协变

ios - 如何处理从 Firebase 获取的数据

java - 执行一个简单的 mapreduce 函数以在 Hadoop 的日志文件中搜索字符串

java - Spring BeanFactory加载和卸载

java - 使用泛型 java 进行类声明

python - 如何在 python3 中注释生成器?

java - 我可以在 hibernate.properties 中指定 hibernate 注释类吗?