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)));
}
và
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.
Điểm rất tốt. –
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? –
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 đó. –