如何使用注释来表示参数化类型?

时间:2017-09-03 16:48:34

标签: java annotations

我尝试使用注释处理器来生成类似的方法:

void result(Consumer<Type> name){

}

我需要使用注释来表示参数。

@Retention(RetentionPolicy.SOURCE)
public @interface Parameter {

  String name();

  Class<?> type();
}

但是注释成员只支持编译时常量,所以不可能直接传递参数化类型,例如下面的非法java代码不能用注释表示。

@Parameter(name ="ids",type = ArrayList<Integer>.class)

我试图声明一个新的注释来表示类型,因为泛型参数可以是一个或多个并嵌套,例如ArrayList <HashMap <String, String >>,但java不支持注释引用本身,它会导致循环注释元素类型错误。以下注释也是非法的。

public @interface Type{
  Class<?> type();
  Type[] parameters() default {};
}

@Retention(RetentionPolicy.SOURCE)
public @interface Parameter {

  String name();

  Type type();
}

任何解决方案?

1 个答案:

答案 0 :(得分:0)

如果无法将值表示为注释参数,则标准解决方案是使用字符串。例如,使用@Parameter(..., type = ArrayList<Integer>.class)而不是@Parameter(..., type = "ArrayList<Integer>"),它可以表示任意嵌套的参数化类型。

使用注释的代码必须解析和验证String参数。