class ProfileCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
MultiValueMap<String, Object> attrs = metadata.getAllAnnotationAttributes(Profile.class.getName());
if (attrs != null) {
for (Object value : attrs.get("value")) {
if (context.getEnvironment().acceptsProfiles((String[]) value)){
return true;
}
}
return false;
}
return true;
}
如您所见,ProfileCondition从AnnotationTypeMetadata中获取@Profile注释的所有注释属性。在Profile类中,值定义为String[] value();
因此,for (Object value : attrs.get("value")
表示value是一个String参数,但为什么它被转换为String []类型?
答案 0 :(得分:0)
这里的关键是查看您要查询的数据结构。 attrs
是一个MultiValueMap
或一个数据结构,它将一个键(在本例中为String
)映射到一定数量的值(在本例中为每个类型Object
) 。 attrs.get
返回特定键映射到的值集。因此,attrs.get
会返回对象列表List<Object>
。由于我们要查询"values"
,因此返回的列表包含一个Object
,实际上是String[]
类型。但是,由于MultiValueMap
存储了几种不同类型的值,因此映射的值类型必须是共同的祖先类:Object
。
总而言之,attrs.get
可以返回多个结果,因此返回一个可迭代的结果。对于密钥"values"
,它的返回类型是(有效)List<String[]>
。我们迭代迭代,并且在for循环的每次迭代中,value
都是String[]
类型并且是向下转换的。