gpt4 book ai didi

java - 如何在通用绑定(bind)上获取 TYPE_USE 注释

转载 作者:搜寻专家 更新时间:2023-10-31 20:17:16 25 4
gpt4 key购买 nike

我有这个案例:

public class SomeClass<T> {
public <@A1 S extends @A2 T> @A3 S myMethod() { ...}
}

我正在尝试在绑定(bind)的 T 上获取 @A2 注释。
这就是我所看到的,假设 myMethodSomeClass.class.getDeclaredMethod("myMethod")。为了便于阅读,删除了类型转换。

  • myMethod.getGenericReturnType().getAnnotations() 返回 @A1(我猜是预期的)
  • myMethod.getGenericReturnType().getBounds()[0].getAnnotations() 返回nothing(??不应该是@A2 ??)
  • myMethod.getAnnotatedReturnType().getAnnotations() 返回 @A3(我猜是预期的)
  • myMethod.getAnnotatedReturnType().getAnnotatedBounds()[0].getAnnotations() 返回nothing(我猜是异常(exception)情况)

似乎 @A2 迷路了……这听起来不明智。我是做错了什么还是这确实是一些奇怪的行为?

更新:这确实是一个 JDK 错误,我报告了它并被接受为 JDK-8191466

最佳答案

除了TypeVariable,它的注解可以通过AnnotatedTypeVariable.getType()获取,所有的类型注解都可以通过AnnotatedType层次获取> 这将是 TypeVariable 的一个实例,它扩展了 AnnotatedElement 现在恰好与 Method.getGenericReturnType() 返回的对象相同。

因此您可以检索所有信息,例如

AnnotatedType art = myMethod.getAnnotatedReturnType();
System.out.print(
Arrays.toString(art.getAnnotations())+" "+art.getType().getTypeName()+" -> ");
final boolean typeVariable = art instanceof AnnotatedTypeVariable;
if (typeVariable) System.out.print('<');
System.out.print(Arrays.toString(((AnnotatedElement)art.getType()).getAnnotations()) + " ");
System.out.print(art.getType().getTypeName());
if (typeVariable) {
AnnotatedTypeVariable atv = (AnnotatedTypeVariable)art;
AnnotatedType[] annotatedBounds = atv.getAnnotatedBounds();
if (annotatedBounds.length > 0) {
System.out.print(" extends ");
for (AnnotatedType aBound: annotatedBounds) {
System.out.print(Arrays.toString(aBound.getAnnotations()) + " ");
System.out.print(aBound.getType().getTypeName() + ", ");
}
}
System.out.println(">");
}

将打印

[@A3()] S -> <[@A1()] S extends [@A2()] T, >

当你调用 ((AnnotatedTypeVariable)myMethod.getAnnotatedReturnType()) .getAnnotatedBounds()[0].getAnnotations() 不提供 @A2 时,你应该重新检查 A2 是否确实具有 @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE_USE)

当然,这是只处理您的特定方法的“简化”版本。

要处理所有可能的情况,您将需要更多的 instanceof,处理这些 TypeAnnotatedType 的分离类型层次结构,尤其是在处理带注释的参数化类型和带注释的泛型数组类型时。

如上所述,TypeVariable 是不同的,因为它扩展了 AnnotatedElement 并且还具有 getAnnotatedBounds() 方法。因此,在这种特定情况下,处理该方法的另一种方法是

List<TypeVariable<?>> typeParameters = Arrays.asList(myMethod.getTypeParameters());

for (TypeVariable<?> tv: typeParameters) {
System.out.print("< "+Arrays.toString(tv.getAnnotations())+" "+tv.getName());
AnnotatedType[] annotatedBounds = tv.getAnnotatedBounds();
if (annotatedBounds.length > 0) {
System.out.print(" extends ");
for (AnnotatedType aBound: annotatedBounds) {
System.out.print(Arrays.toString(aBound.getAnnotations()) + " ");
System.out.print(aBound.getType().getTypeName() + ", ");
}
}
System.out.print("> ");
}

AnnotatedType art = myMethod.getAnnotatedReturnType();
System.out.print(Arrays.toString(art.getAnnotations()) + " ");
int ix = typeParameters.indexOf(art.getType());
if (ix >= 0) System.out.print("[ref to type parameter #" + ix + "] ");
System.out.println(art.getType().getTypeName());

关于java - 如何在通用绑定(bind)上获取 TYPE_USE 注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47175573/

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