我正在为 Fluent API 构建代码生成器。我想为每个现有的(POJO)类创建一个新类。我没有控制现有的课程。我通过反射解析现有方法,如果遇到 setter 或“add”方法,我会在我的 Fluent-Wrapper 类中为此创建一个方法,所以我可以说 child().values(....).get ()。
这适用于简单的参数。我花了一段时间才弄清楚如何处理 ParameterizedTypes,但我现在可以处理它了。我没有得到的是如何为泛型参数创建一个具体方法,该方法的类型不是在方法本身上定义,而是在包含类上。
我有这样的事情:
abstract class Parent<T> {
void setValues(List<T> values) {...};
}
class Child extends Parent<String> {}
现在我尝试通过 JCodeModel 生成代码,需要解析参数“values”的类型。问题:我得到一个包含 List 和 TypeVariable "T" 的 ParameterizedType。但我无法将“T”映射回字符串。但我无法弄清楚如何通过实现“Child”来获得具体的“T”类型。任何人?
澄清:我这样做,当涉及到“TypeVariable”的情况时,不需要“T”而是“String”
JType result = codeModel._ref(typeToClass.apply(type));
if (isParameterizedType(type)) {
for (Type typeArgument : ((ParameterizedType) type).getActualTypeArguments()) {
if (typeArgument instanceof WildcardType) {
result = narrow(result, codeModel.wildcard());
} else if (typeArgument instanceof Class) {
result = narrow(result, typeToClass.asJType(codeModel, typeArgument));
} else if (typeArgument instanceof TypeVariable<?>) {
TypeVariable<?> typeVariable = (TypeVariable<?>) typeArgument;
// this is where I only get "T" but need "String"
result = ((JClass) result).narrow(getTypeVariable(codeModel.parseType(typeVariable.getName()));
}
}
}