遍历@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可用的所有标志会很有用。

我可以遍历MysteryFlags设置的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的保留策略)。