Considerate questa classe:Scorrere valori in @IntDef, @StringDef o qualsiasi classe @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.
}
Spesso ho creato qualcosa di simile, e ha scoperto che sarebbe utile essere in grado di scorrere tutti bandiere disponibili in MysteryFlags
.
Posso scorrere i miei valori impostati in MysteryFlags
?
Questo è quello che ho provato:
Questo stampato ANNOTATION: @java.lang.annotation.Retention(value=SOURCE)
:
for (Annotation annotation : Flag.class.getAnnotations()) {
Log.d(TAG, String.format("ANNOTATION: %s", String.valueOf(annotation)));
}
Questo gettato NPE su un null accesso Array
for (ExtraAction enm : Flag.class.getEnumConstants()) {
Log.d(TAG, String.format("ENUM: %s", String.valueOf(enm)));
}
Questi non è stato stampato nulla:
for (Field field : Flag.class.getFields()) {
Log.d(TAG, String.format("FIELD: %s", String.valueOf(field)));
}
e
for (Class<?> aClass : ExtraAction.class.getClasses()) {
Log.d(TAG, String.format("CLASS: %s", String.valueOf(aClass)));
}
So che posso solo aggiungere i valori di un array e iterare che, ma che richiede la memorizzazione di un altro array. È quello che ho fatto, ma mi chiedo ancora se c'è un modo migliore.
Ottimo punto. –
È possibile eseguire iterazione se si modifica il criterio di conservazione in runtime? –
Se stai cercando di guardare i valori di '@ IntDef', allora non penso. Non sarebbe possibile modificare la politica di conservazione di tale annotazione. –