2015-08-22 5 views
7

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.

risposta

6

Non penso che sarà possibile interrogarlo in quel modo in fase di esecuzione. L'annotazione ha un criterio di conservazione di SOURCE, il che significa che verrà scartato dal compilatore. Inoltre, l'annotazione @IntDef ha un criterio di conservazione di CLASS, il che significa che lo esegue tramite la compilazione, ma non lo farà in fase di runtime. Ecco perché vedi solo l'annotazione @Retention nel tuo primo ciclo (quell'annotazione ha un criterio di conservazione di RUNTIME).

+0

Ottimo punto. –

+0

È possibile eseguire iterazione se si modifica il criterio di conservazione in runtime? –

+2

Se stai cercando di guardare i valori di '@ IntDef', allora non penso. Non sarebbe possibile modificare la politica di conservazione di tale annotazione. –

Problemi correlati