как сгенерировать класс символов‹?› с помощью javapoet

я хочу создать такое поле:

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

WildcardTypeName.subtypeOf(Object.class) может дать '?' WildcardTypeName.subtypeOf(Class.class) может дать «Класс»


person dong sheng    schedule 09.11.2016    source источник


Ответы (2)


Если разбить этот тип на составные части, вы получите:

  • ?
  • Class
  • Class<?>
  • String
  • Map
  • Map<String, Class<?>>

Затем вы можете создать эти составные части таким же образом, используя API-интерфейсы JavaPoet:

  • 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();
person Jake Wharton    schedule 09.11.2016
comment
извините, я не могу найти ParameterizedTypeName.create(xx,xx) в ParameterizedTypeName.java - person dong sheng; 13.11.2016
comment
Используйте 1_ - person Chad Bingham; 04.10.2017

Использование 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<?>>();
}
person Naman    schedule 29.01.2017