我想產生這樣一個領域: '?'如何生成符號類<?>與javapoet
public static Map<String, Class<?>> ID_MAP = new HashMap<String, Class<?>>();
WildcardTypeName.subtypeOf(Object.class)可以給 WildcardTypeName.subtypeOf(Class.class)可以給 '類'
我想產生這樣一個領域: '?'如何生成符號類<?>與javapoet
public static Map<String, Class<?>> ID_MAP = new HashMap<String, Class<?>>();
WildcardTypeName.subtypeOf(Object.class)可以給 WildcardTypeName.subtypeOf(Class.class)可以給 '類'
如果你打破這種類型的成組成部分您將獲得:
?
Class
Class<?>
String
Map
Map<String, Class<?>>
然後,您可以建立以同樣的方式將這些部件使用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.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<?>>(); }
是,這個效果很好 –
@dongsheng如果這有助於。請接受它作爲答案。 :) – nullpointer
對不起,我不能找到ParameterizedTypeName.create(XX,XX)在ParameterizedTypeName.java –
使用'ParameterizedTypeName.get()' –