遍历@ IntDef,@ StringDef或任何@Def类中的值
考虑此类:
public class MyClassOfMystery { public static final int NO_FLAGS = ~0;
public static final int FIRST_FLAG = 1;
public static final int SECOND_FLAG = 1 << 1;
public static final int THIRD_FLAG = 1 << 2;
public static final int FOURTH_FLAG = 1 << 3;
@Retention(RetentionPolicy.SOURCE)
@IntDef(flag = true, value = {NO_FLAGS, FIRST_FLAG, SECOND_FLAG, THIRD_FLAG, FOURTH_FLAG})
public @interface MysteryFlags { }
... set flags, get flags, and use flags stuff.
}
我经常创建类似这样的内容,并发现能够遍历中可用的所有标志将很有用MysteryFlags
。
这是我尝试过的:
此印刷ANNOTATION: @java.lang.annotation.Retention(value=SOURCE)
:
for (Annotation annotation : Flag.class.getAnnotations()) { Log.d(TAG, String.format("ANNOTATION: %s", String.valueOf(annotation)));
}
这将NPE置于空数组访问上
for (ExtraAction enm : Flag.class.getEnumConstants()) { Log.d(TAG, String.format("ENUM: %s", String.valueOf(enm)));
}
这些没有打印出任何东西:
for (Field field : Flag.class.getFields()) { Log.d(TAG, String.format("FIELD: %s", String.valueOf(field)));
}
和
for (Class<?> aClass : ExtraAction.class.getClasses()) { Log.d(TAG, String.format("CLASS: %s", String.valueOf(aClass)));
}
我知道我可以将值添加到数组中并对其进行迭代,但这需要存储另一个数组。这是我所做的,但仍然想知道是否有更好的方法。
回答:
我认为您无法在运行时像这样查询它。您的@MysterFlags
注释的保留策略为SOURCE
,这意味着它将被编译器丢弃。此外,@IntDef
注释的保留策略为CLASS
,这意味着它可以通过编译来实现,但不会在运行时使用。因此,您只会@Retention
在第一个循环中看到注释(注释的保留策略为RUNTIME
)。
以上是 遍历@ IntDef,@ StringDef或任何@Def类中的值 的全部内容, 来源链接: utcz.com/qa/412310.html