2015-08-22 15 views
7

xem xét lớp này:Duyệt qua các giá trị trong @IntDef, @StringDef hay bất kỳ lớp @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. 
} 

Tôi thường tạo ra một cái gì đó như thế này, và thấy rằng nó sẽ hữu ích để có thể lặp qua tất cả cờ có sẵn trong MysteryFlags.

Tôi có thể lặp qua các giá trị của mình được đặt trong MysteryFlags không?

Đây là những gì tôi đã cố gắng:


này in ANNOTATION: @java.lang.annotation.Retention(value=SOURCE):

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

này ném NPE trên một null truy cập mảng

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

Những không in bất cứ điều gì ra:

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))); 
} 

Tôi biết tôi chỉ có thể thêm các giá trị cho một mảng và lặp thông qua đó, nhưng điều đó đòi hỏi lưu trữ khác mảng. Đó là những gì tôi đã làm, nhưng vẫn tự hỏi nếu có một cách tốt hơn.

Trả lời

6

Tôi không nghĩ rằng bạn sẽ có thể truy vấn nó như thế khi chạy. Chú thích @MysterFlags của bạn có chính sách lưu giữ là SOURCE, có nghĩa là nó sẽ bị trình biên dịch loại bỏ. Hơn nữa, chú thích @IntDef có chính sách lưu giữ là CLASS, có nghĩa là nó làm cho nó thông qua biên dịch, nhưng sẽ không làm cho nó chạy trong thời gian chạy. Đó là lý do tại sao bạn chỉ thấy chú thích @Retention trong vòng lặp đầu tiên của bạn (chú thích đó có chính sách lưu giữ là RUNTIME).

+0

Điểm rất tốt. –

+0

Tôi có thể lặp lại nếu tôi thay đổi chính sách lưu giữ thành thời gian chạy không? –

+2

Nếu bạn đang cố gắng xem xét các giá trị cho '@ IntDef', thì tôi không nghĩ vậy. Bạn sẽ không thể thay đổi chính sách lưu giữ của chú thích đó. –

Các vấn đề liên quan