gpt4 book ai didi

java - 为什么泛型类型参数上的注释对于嵌套类型不可见?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:01:08 32 4
gpt4 key购买 nike

我没有得到以下代码的行为: https://gist.github.com/tomaszalusky/3e3777b4fd0c6096f3f707bb19b50b52 - 查看嵌入式:

import java.lang.reflect.*;
import java.util.*;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;


public class AnnotationOnTypeArgument {

@Target({ElementType.FIELD,ElementType.PARAMETER,ElementType.METHOD,ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Anno {

}

interface Nested<T> {

}

Toplevel<@Anno Integer> toplevel;

Nested<@Anno Integer> nested;

public static void main(String[] args) throws Exception {
print(AnnotationOnTypeArgument.class.getDeclaredField("toplevel"));
print(AnnotationOnTypeArgument.class.getDeclaredField("nested"));
}

private static void print(Field field) {
AnnotatedType annotatedType = field.getAnnotatedType();
AnnotatedParameterizedType annotatedParameterizedType = (AnnotatedParameterizedType)annotatedType;
ParameterizedType parameterizedType = (ParameterizedType)annotatedParameterizedType.getType();
AnnotatedType argType = annotatedParameterizedType.getAnnotatedActualTypeArguments()[0];
System.out.printf("field %s%ntype=%s%nannotatedType=%s%nannotations=%s%ntype=%s%n%n",
field.getName(), parameterizedType, argType, Arrays.asList(argType.getDeclaredAnnotations()), argType.getType());
}

}

interface Toplevel<T> {

}

编辑:实际结果是:

field toplevel
type=Toplevel<java.lang.Integer>
annotatedType=sun.reflect.annotation.AnnotatedTypeFactory$AnnotatedTypeBaseImpl@1540e19d
annotations=[@AnnotationOnTypeArgument$Anno()]
type=class java.lang.Integer

field nested
type=AnnotationOnTypeArgument.AnnotationOnTypeArgument$Nested<java.lang.Integer>
annotatedType=sun.reflect.annotation.AnnotatedTypeFactory$AnnotatedTypeBaseImpl@677327b6
annotations=[]
type=class java.lang.Integer

为什么嵌套周围类型时,类型参数上声明的注释数组为空?我希望有一个元素就像顶级类型一样。如果有任何基于 JLS 的解释,我将不胜感激。

在 JDK8u101 ( http://compilejava.net )、较旧的 JDK8 和 Eclipse 上始终发生。

谢谢!

最佳答案

这是 OpenJDK 中的一个错误,我刚才已经报告过这个问题,希望得到修复。类型注释在实践中并没有真正使用那么多,它似乎也不是一个优先事项。正如 Holger 所提到的,这是 AnnotatedTypeFactory 实现中的一个混淆。

您可以使用 Byte Buddy正确解析类文件元数据:

public static void main(String[] args) throws Exception {

TypeDescription type = TypePool.Default.ofClassPath()
.describe(AnnotationOnTypeArgument.class.getName())
.resolve();

print(type.getDeclaredFields().filter(named("toplevel")).getOnly());
print(type.getDeclaredFields().filter(named("nested")).getOnly());
}

private static void print(FieldDescription field) {
System.out.printf("field %s%ntype=%s%nannotations=%s%ntype=%s%n%n",
field.getName(),
field.getType(),
field.getType().getTypeArguments().get(0),
field.getType().getTypeArguments().get(0).getDeclaredAnnotations());
}

这为您提供了预期的输出:

field toplevel
type=net.bytebuddy.Toplevel<java.lang.Integer>
annotations=class java.lang.Integer
type=[@net.bytebuddy.AnnotationOnTypeArgument$Anno()]

field nested
type=net.bytebuddy.AnnotationOnTypeArgument.net.bytebuddy.AnnotationOnTypeArgument$Nested<java.lang.Integer>
annotations=class java.lang.Integer
type=[@net.bytebuddy.AnnotationOnTypeArgument$Anno()]

关于java - 为什么泛型类型参数上的注释对于嵌套类型不可见?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39952812/

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