首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >java批注是否可以像HashMap一样具有复杂的返回类型

java批注是否可以像HashMap一样具有复杂的返回类型
EN

Stack Overflow用户
提问于 2012-11-27 00:33:41
回答 2查看 20K关注 0票数 29

Can注释具有复杂的返回类型,如HashMap。

我正在寻找类似这样的东西:

代码语言:javascript
复制
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface column {
    public HashMap<String, String> table();
}

所以我可以有一个常量注释,比如(伪代码):

代码语言:javascript
复制
@column({table=(dbName, tableName), table=(dbName, tableName2)})
public static final String USER_ID = "userid";

如果Annotation不允许使用复杂的返回类型,那么对于这种情况有什么好的实践吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-27 00:35:45

不可以,注释元素只能是原始类型、字符串、enum类型、Class、其他注释或这些类型的数组。表示这类结构的典型方法是声明另一个注释类型

代码语言:javascript
复制
public @interface TableMapping {
  public String dbName();
  public String tableName();
}

然后说

代码语言:javascript
复制
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface column {
    public TableMapping[] table();
}

并将该注释用作

代码语言:javascript
复制
@column(table={
  @TableMapping(dbName="dbName", tableName="tableName"),
  @TableMapping(dbName="db2", tableName="table2")
})
public String userId = "userid";
票数 69
EN

Stack Overflow用户

发布于 2017-07-31 07:11:02

几年后,我们引入了Java 8。它提供了一种重复相同类的注释的方法。

在Java8中,您可以声明要隐式包装在容器注释中的注释。将希望可重复的批注声明为@Repeated(value=a_class)。当您添加可重复批注的多个实例时,编译器将自动将这些实例包装在容器批注a_class中,该容器批注被指定为@Repeated的参数。

如果您声明:

代码语言:javascript
复制
@Retention(RetentionPolicy.RUNTIME)
public @interface Columns {
    Column[] value() default {};
}

@Retention(RetentionPolicy.RUNTIME)
@Repeatable( value = Columns.class )
public @interface Column {
    String dbName();
    String tableName();
}

然后,您可以多次使用该注释,无论是否将其包装在另一个注释中,两者都是等效的:

代码语言:javascript
复制
@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)检索注释。

代码语言:javascript
复制
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();
    }
}

它应该输出:

代码语言:javascript
复制
Field: USER_ID
    db: db1 table: table1
    db: db2 table: table2

Field: LAST_NAME
    db: db3 table: table3
    db: db4 table: table4
票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13569079

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档