如何在Android中使用Javapoet生成StringDef

时间:2017-03-05 06:33:04

标签: android annotation-processing javapoet

如何在Javapoet中生成@StringDef枚举? 注释仅适用于方法或类型构建器,而StringDefs是三个注释语句,没有这些注释语句。

1 个答案:

答案 0 :(得分:1)

使用Javapoet 1.8.0+可以使用这样的代码:

private void createEnumStringDef(TypeSpec.Builder beanBuilder, String enumName, List<String> enumValues) {

    String defValues = "{";

    for (String defVal :enumValues) {
        defValues += enumName +"." +defVal.toUpperCase() +",";
    }

    defValues = Utils.removeLastChar(defValues) + "}";

    TypeSpec.Builder stringDef = TypeSpec.annotationBuilder(enumName)
            .addModifiers(Modifier.PUBLIC)
            .addAnnotation(AnnotationSpec.builder(ClassName.get("android.support.annotation", "StringDef")).addMember("value", defValues).build())
            .addAnnotation(AnnotationSpec.builder(ClassName.get("java.lang.annotation", "Retention")).addMember("value", "$T.SOURCE", ClassName.get("java.lang.annotation", "RetentionPolicy")).build());

    for (String defVal : field.enumValues) {
        stringDef.addField(FieldSpec.builder(String.class, defVal.toUpperCase())
                .addModifiers(Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL)
                .initializer("$S", defVal)
                .build());
    }

    beanBuilder.addType(stringDef.build());

}