栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如果在List或Map中注释数组,则Java 8 TYPE_USE注释将不起作用

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如果在List或Map中注释数组,则Java 8 TYPE_USE注释将不起作用

在您的初始通话中,

create
您传递的是 字段 注释,而不是的注释
AnnotatedTypeat
。因此,该方法
create
负责调用
at.getAnnotations()
。如果看一下实现,您会发现它只会在数组情况下这样做。在所有其他情况下,您的方法将逻辑切换为“传入的注释数组是与关联的数组
at
”。

问题在于您的第一个示例似乎偶然地起作用。您没有显示

@First
注释的声明,但我怀疑
@Target
s
ElementType.FIELD

都允许使用
ElementType.TYPE_USE
。在这种情况下,形式的声明

@First("array") List… [] fieldName;

是不明确的并且注释将被记录为 两个
,一个字段注释

fieldName
和用于注释
List…[]
类型。因此,在第一个示例中无法识别递归过程中丢失一个注释数组的事实,因为它恰好与字段注释匹配。但是,一旦
TYPE_USE
只允许注释而不是
FIELD
目标注释,则您的代码甚至无法与第一个示例一起使用。

因此,您必须确定传入的批注数组是与

at
参数关联的数组还是与周围上下文关联的数组。如果两者都关联起来会更容易,因为在这种情况下,您可以通过让方法检索该数组而不是调用方来完全摆脱该参数。

您应该记住:

  1. 如果要记录递归类型的所有类型注释 字段注释,则注释数组将比类型节点多一个
  2. 如果要
    TYPE_USE
    主要处理注释,则根本不需要处理字段注释

这是一个简单,直接的解析代码,可查找所有注释:

public static void fullType(Field f) {    AnnotatedType at = f.getAnnotatedType();    fullType("t", at);    System.out.println(f.getName());}public static void fullType(String header, AnnotatedType at) {    final boolean arrayType = at instanceof AnnotatedArrayType;    if(arrayType) {        fullType(header+"t", ((AnnotatedArrayType)at).getAnnotatedGenericComponentType());    }    for(Annotation a: at.getAnnotations())        System.out.println(header+a);    if(arrayType) {        System.out.println(header+"[]");    }    else if(at instanceof AnnotatedParameterizedType) {        AnnotatedParameterizedType apt = (AnnotatedParameterizedType)at;        System.out.println(header +((ParameterizedType)apt.getType()).getRawType().getTypeName());        System.out.println(header+'<');        String subHeader=header+"t";        for(AnnotatedType typeArg: apt.getAnnotatedActualTypeArguments()) fullType(subHeader, typeArg);        System.out.println(header+'>');    }    else if(at instanceof AnnotatedTypeVariable) {        // when appearing in a Field’s type, it refers to Class’ type variables        System.out.println(header+at.getType().getTypeName());    }    else if(at instanceof AnnotatedWildcardType) {        System.out.println(header+"?");        final AnnotatedWildcardType awt = (AnnotatedWildcardType)at;        AnnotatedType[] bounds=awt.getAnnotatedLowerBounds();        if(bounds==null || bounds.length==0) { bounds=awt.getAnnotatedUpperBounds(); if(bounds==null || bounds.length==0) return; System.out.println(header+"extends");        }        else System.out.println(header+"super");        header+="t";        for(AnnotatedType b: bounds) fullType(header, b);    }    else {        assert at.getType().getClass()==Class.class;        System.out.println(header+at.getType().getTypeName());    }}

它可以完美地与您的示例字段一起使用。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/610208.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号