2015-08-22 12 views
7

bu sınıfı düşünün:Bıkmadan

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. 
} 

Sık sık böyle bir şey yarattık ve tüm yinelemenize edebilmek için yararlı olacağını bulundu bayraklar MysteryFlags'da kullanılabilir.

MysteryFlags'da ayarlanmış değerlerimi kullanarak yineleyebilir miyim?


Bu ANNOTATION: @java.lang.annotation.Retention(value=SOURCE) baskılı:


Bu

for (Annotation annotation : Flag.class.getAnnotations()) { 
    Log.d(TAG, String.format("ANNOTATION: %s", String.valueOf(annotation))); 
} 
boş Dizi erişimi

for (ExtraAction enm : Flag.class.getEnumConstants()) { 
    Log.d(TAG, String.format("ENUM: %s", String.valueOf(enm))); 
} 
tarihinde NPE attı

Bu denedim budur Ben sadece bir diziye değerleri ekleyin ve bu yinelemenize biliyorum

for (Field field : Flag.class.getFields()) { 
    Log.d(TAG, String.format("FIELD: %s", String.valueOf(field))); 
} 

ve

for (Class<?> aClass : ExtraAction.class.getClasses()) { 
     Log.d(TAG, String.format("CLASS: %s", String.valueOf(aClass))); 
} 

, ama bu başka saklamak gerekir:

Bunlar 210 şey yazdırmak vermedi dizi. Yaptığım şey, ama yine de daha iyi bir yol olup olmadığını merak ediyorum.

cevap

6

Bunu çalışma zamanında böyle sorgulayabileceksinizdir. @MysterFlags ek açıklamanızın SOURCE bir tutma politikası vardır; bu, derleyici tarafından atılacağı anlamına gelir. Ayrıca, @IntDef ek açıklaması, CLASS bir tutma politikasına sahiptir, yani bunu derleme yoluyla yapar, ancak çalışma zamanına dönüştürmez. Bu nedenle, ilk döngüde yalnızca @Retention ek açıklamasını görüyorsunuz (bu açıklama, RUNTIME numaralı bir saklama politikasına sahiptir).

+0

Çok iyi nokta. –

+0

Saklama politikasını çalışma zamanına değiştirirseniz yineleyebilir miyim? –

+2

Eğer @ IntDef'in değerlerine bakmaya çalışıyorsanız, ben öyle düşünmüyorum. Bu ek açıklamanın saklama politikasını değiştiremezsiniz. –