how to generate symbol Class<?> with javapoet

后端 未结 2 1013
轮回少年
轮回少年 2021-01-02 18:00

i want to generate a field like this:

public static Map> ID_MAP = new HashMap>();

2条回答
  •  死守一世寂寞
    2021-01-02 18:28

    Using ParameterizedTypeName.get() worked for me -

    public static void main(String[] args) throws IOException {
    
        TypeName wildcard = WildcardTypeName.subtypeOf(Object.class);
    
        TypeName classOfAny = ParameterizedTypeName.get(
                ClassName.get(Class.class), wildcard);
    
        TypeName string = ClassName.get(String.class);
    
        TypeName mapOfStringAndClassOfAny = ParameterizedTypeName.get(ClassName.get(Map.class), string, classOfAny);
    
        TypeName hashMapOfStringAndClassOfAny = ParameterizedTypeName.get(ClassName.get(HashMap.class), string, classOfAny);
    
        FieldSpec fieldSpec = FieldSpec.builder(mapOfStringAndClassOfAny, "ID_MAP")
                .addModifiers(Modifier.PUBLIC, Modifier.STATIC)
                .initializer("new $T()", hashMapOfStringAndClassOfAny)
                .build();
    
        TypeSpec fieldImpl = TypeSpec.classBuilder("FieldImpl")
                .addModifiers(Modifier.PUBLIC, Modifier.FINAL)
                .addField(fieldSpec)
                .build();
    
        JavaFile javaFile = JavaFile.builder("com", fieldImpl)
                .build();
    
        javaFile.writeTo(System.out);
    }
    

    Imports used by me -

    import com.squareup.javapoet.*;
    import javax.lang.model.element.Modifier;
    import java.io.IOException;
    import java.util.HashMap;
    import java.util.Map;
    

    This generates the output as -

    package com;
    
    import java.lang.Class;
    import java.lang.String;
    import java.util.HashMap;
    import java.util.Map;
    
    public final class FieldImpl {
      public static Map> ID_MAP = new HashMap>();
    }
    

提交回复
热议问题