在您的初始通话中,
create您传递的是 字段 注释,而不是的注释
AnnotatedTypeat。因此,该方法
create负责调用
at.getAnnotations()。如果看一下实现,您会发现它只会在数组情况下这样做。在所有其他情况下,您的方法将逻辑切换为“传入的注释数组是与关联的数组
at”。
问题在于您的第一个示例似乎偶然地起作用。您没有显示
@First注释的声明,但我怀疑
@Targets
ElementType.FIELD和
都允许使用
ElementType.TYPE_USE。在这种情况下,形式的声明
@First("array") List… [] fieldName;是不明确的并且注释将被记录为 两个
,一个字段注释
fieldName和用于注释
List…[]类型。因此,在第一个示例中无法识别递归过程中丢失一个注释数组的事实,因为它恰好与字段注释匹配。但是,一旦
TYPE_USE只允许注释而不是
FIELD目标注释,则您的代码甚至无法与第一个示例一起使用。
因此,您必须确定传入的批注数组是与
at参数关联的数组还是与周围上下文关联的数组。如果两者都关联起来会更容易,因为在这种情况下,您可以通过让方法检索该数组而不是调用方来完全摆脱该参数。
您应该记住:
- 如果要记录递归类型的所有类型注释 和 字段注释,则注释数组将比类型节点多一个
- 如果要
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()); }}它可以完美地与您的示例字段一起使用。



