Ein paar Jahre später verwenden bringt us Java 8. Es bietet eine Möglichkeit, Anmerkungen der gleichen Klasse zu wiederholen.
In Java 8 können Sie eine Annotation deklarieren, die implizit in eine Containeranmerkung eingeschlossen wird. Sie geben als @Repeated(value=a_class)
eine Annotation an, die wiederholbar sein soll. Wenn Sie mehrere Instanzen einer wiederholbaren Annotation hinzufügen, wird der Compiler diese automatisch in die als Argument angegebene Container-Annotation a_class
umbrechen (@Repeated
).
Wenn Sie erklären:
@Retention(RetentionPolicy.RUNTIME)
public @interface Columns {
Column[] value() default {};
}
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(value = Columns.class)
public @interface Column {
String dbName();
String tableName();
}
dann können Sie die Anmerkung mehrfach verwenden, mit oder ohne sie in einer anderen Anmerkung Einwickeln, beide sind gleichwertig:
@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";
Die Anmerkungen abgerufen werden unter Verwendung getAnnotationsByType(class)
in beide Fälle.
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();
}
}
Es sollte Ausgabe:
Field: USER_ID
db: db1 table: table1
db: db2 table: table2
Field: LAST_NAME
db: db3 table: table3
db: db4 table: table4
ausgezeichnete Frage .. –