【问题标题】:how to generate symbol Class<?> with javapoet如何使用 javapoet 生成符号 Class<?>
【发布时间】:2017-01-29 23:45:52
【问题描述】:

我想生成这样的字段:

public static Map<String, Class<?>> ID_MAP = new HashMap<String, Class<?>>();

WildcardTypeName.subtypeOf(Object.class) 可以给出 '?' WildcardTypeName.subtypeOf(Class.class) 可以给'Class'

【问题讨论】:

    标签: javapoet


    【解决方案1】:

    如果你将该类型分解成它的组成部分,你会得到:

    • ?
    • Class
    • Class&lt;?&gt;
    • String
    • Map
    • Map&lt;String, Class&lt;?&gt;&gt;

    然后您可以使用 JavaPoet 的 API 以相同的方式构建这些组件:

    • TypeName wildcard = WildcardTypeName.subtypeOf(Object.class);
    • TypeName cls = ClassName.get(Class.class);
    • TypeName clsWildcard = ParameterizedTypeName.create(cls, wildcard);
    • TypeName string = ClassName.get(String.class);
    • TypeName map = ClassName.get(Map.class);
    • TypeName mapStringClass = ParameterizedTypeName.create(map, string, clsWildcard);

    一旦你有了那个类型,对HashMap 做同样的事情应该很容易(只需将Map.class 替换为HashMap.class),然后就可以像往常一样构建字段了。

    FieldSpec.builder(mapStringClass, "ID_MAP")
        .addModifiers(PUBLIC, STATIC)
        .initializer("new $T()", hashMapStringClass)
        .build();
    

    【讨论】:

    • 对不起,我在 ParameterizedTypeName.java 中找不到 ParameterizedTypeName.create(xx,xx)
    • 使用ParameterizedTypeName.get()
    【解决方案2】:

    使用 ParameterizedTypeName.get() 为我工作 -

    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);
    }
    

    我使用的进口商品 -

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

    这会生成输出为 -

    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<String, Class<?>> ID_MAP = new HashMap<String, Class<?>>();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-18
      • 1970-01-01
      • 2021-09-19
      • 1970-01-01
      • 1970-01-01
      • 2015-11-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多