我正在为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"的类型。我得到了一个包含列表和TypeVariable "T"的ParameterizedType,但是我不能将"T"Map回String,但是我不知道如何通过实现"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()));
}
}
}
2条答案
按热度按时间ymdaylpp1#
如果您使用的是我的TypeTools库,这将变得非常简单:
fnx2tebb2#
尝试这个...必要时调整,添加错误检查等...
用法: