Một vài năm sau đó mang chúng tôi Java 8. Nó cung cấp một cách để lặp lại các chú thích của cùng một lớp.
Trong Java 8, bạn có thể khai báo chú thích được bao bọc hoàn toàn trong chú thích vùng chứa. Bạn khai báo là @Repeated(value=a_class)
chú thích bạn muốn lặp lại. Khi bạn thêm nhiều phiên bản của chú thích có thể lặp lại, trình biên dịch sẽ tự động bao bọc các chú thích này trong chú thích vùng chứa a_class
được chỉ định làm đối số cho @Repeated
.
Nếu bạn khai báo:
@Retention(RetentionPolicy.RUNTIME)
public @interface Columns {
Column[] value() default {};
}
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(value = Columns.class)
public @interface Column {
String dbName();
String tableName();
}
sau đó bạn có thể sử dụng chú thích nhiều lần có hoặc không có gói chúng trong chú thích khác, cả hai đều là tương đương:
@Column(dbName="db1", tableName="table1")
@Column(dbName="db2", tableName="table2")
public static final String USER_ID = "userid";
@Columns({
@Column(dbName="db3", tableName="table3"),
@Column(dbName="db4", tableName="table4")
})
public static final String LAST_NAME = "last name";
Các chú thích được lấy ra sử dụng getAnnotationsByType(class)
trong cả hai trường hợp.
public static void main(String[] args) {
for(Field field : AnnotationsTest.class.getDeclaredFields()){
System.out.println("Field: " + field.getName());
Column[] columns = field.getAnnotationsByType(Column.class);
for(Column column : columns){
System.out.println(" db: " + column.dbName() + " table: " + column.tableName());
}
System.out.println();
}
}
Nó nên đầu ra:
Field: USER_ID
db: db1 table: table1
db: db2 table: table2
Field: LAST_NAME
db: db3 table: table3
db: db4 table: table4
Nguồn
2017-07-30 23:11:01
câu hỏi tuyệt vời .. –