注释是否具有复杂的返回类型,例如HashMap。
我正在寻找类似的东西:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface column {
public HashMap<String, String> table();
}
所以我可以像(伪代码)一样注释常量:
@column({table=(dbName, tableName), table=(dbName, tableName2)})
public static final String USER_ID = "userid";
如果Annotation不允许你有复杂的返回类型,那么对于这种情况有什么好的做法吗?
答案 0 :(得分:60)
不,注释元素只能是基本类型,字符串,enum
类型,Class
,其他注释或任何这些的数组。表示这类结构的典型方法是声明另一个注释类型
public @interface TableMapping {
public String dbName();
public String tableName();
}
然后说
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface column {
public TableMapping[] table();
}
并使用注释
@column(table={
@TableMapping(dbName="dbName", tableName="tableName"),
@TableMapping(dbName="db2", tableName="table2")
})
public String userId = "userid";
答案 1 :(得分:9)
几年后,我们带来了Java 8.它提供了一种重复同一类注释的方法。
在Java 8中,您可以声明一个注释隐式包装在容器注释中。您将@Repeated(value=a_class)
声明为要重复的注释。当您添加可重复注释的多个实例时,编译器将自动将这些实例包装在指定为a_class
的参数的容器注释@Repeated
中。
如果您声明:
@Retention(RetentionPolicy.RUNTIME)
public @interface Columns {
Column[] value() default {};
}
@Retention(RetentionPolicy.RUNTIME)
@Repeatable( value = Columns.class )
public @interface Column {
String dbName();
String tableName();
}
然后你可以多次使用注释,不管是否将它们包装在另一个注释中,两者都是等价的:
@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";
在两种情况下都使用getAnnotationsByType(class)
检索注释。
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();
}
}
应输出:
Field: USER_ID
db: db1 table: table1
db: db2 table: table2
Field: LAST_NAME
db: db3 table: table3
db: db4 table: table4