Java “如何获取泛型类型”;";在方法中重用时的类

Java “如何获取泛型类型”;";在方法中重用时的类,java,reflection,sun-codemodel,jcodemodel,Java,Reflection,Sun Codemodel,Jcodemodel,我正在为fluentapi构建一个代码生成器。我想为每个现有(POJO)类创建一个新类。我无法控制现有的类。我通过反射解析现有方法,如果遇到setter或“add”方法,我会在Fluent包装类中为此创建一个方法,因此我可以说child().values(..).get() 这在使用简单参数时运行良好。我花了一段时间才弄明白如何处理参数化类型,但现在我可以处理了。我不明白的是如何为泛型参数创建一个具体的方法,该泛型参数的类型不是在方法本身上定义的,而是在包含的类上定义的 我有这样的想法: abs

我正在为fluentapi构建一个代码生成器。我想为每个现有(POJO)类创建一个新类。我无法控制现有的类。我通过反射解析现有方法,如果遇到setter或“add”方法,我会在Fluent包装类中为此创建一个方法,因此我可以说child().values(..).get()

这在使用简单参数时运行良好。我花了一段时间才弄明白如何处理参数化类型,但现在我可以处理了。我不明白的是如何为泛型参数创建一个具体的方法,该泛型参数的类型不是在方法本身上定义的,而是在包含的类上定义的

我有这样的想法:

abstract class Parent<T> {
   void setValues(List<T> values) {...};
}

class Child extends Parent<String> {}
抽象类父类{
void setValues(列表值){…};
}
类子级扩展父级{}
现在,我尝试通过JCodeModel生成代码,并需要解析参数“values”的类型。问题:我得到一个参数化类型,它包含一个列表和一个类型变量“T”。但我无法将“T”映射回字符串。但是我不知道如何通过实现“Child”来获得具体的类型“T”。有人吗

澄清:我这样做,当涉及到“TypeVariable”时,不需要“T”而是“String”

JType result=codeModel.\u ref(typeToClass.apply(type));
if(iParameterizedType(类型)){
对于(类型TypeArguments:((ParameteredType)类型)。getActualTypeArguments(){
if(通配符类型的类型参数实例){
结果=窄(结果,codeModel.wildcard());
}else if(类的typeArgument实例){
结果=窄(result,typeToClass.asJType(codeModel,typeArgument));
}else if(TypeVariable的typeArgument实例){
TypeVariable=(TypeVariable)typeArgument;
//这就是我只得到“T”但需要“字符串”的地方
result=((JClass)result).窄(getTypeVariable(codeModel.parseType(typeVariable.getName()));
}
}
}

使用以下方法非常简单:

Class t=TypeResolver.resolveRawArgument(Parent.Class,Child.Class);

试试这个……根据需要进行调整,添加错误检查等

private Class<T> getType(int index) {
    final ParameterizedType parameterizedType = (ParameterizedType) getClass().getGenericSuperclass();
    return (Class<T>) parameterizedType.getActualTypeArguments()[index];
}
私有类getType(int索引){
最终参数化类型参数化类型=(参数化类型)getClass().getGenericSuperclass();
返回(类)ParameteredType.getActualTypeArguments()[index];
}
用法:

Foo42<JFrame,String> foo = new Foo42<>();

if (getType(0).isAssignableFrom(JFrame.class)) {
    // is a JFrame
}

if (getType(1).isAssignableFrom(String.class)) {
    // is a String
}
Foo42 foo=new Foo42();
if(getType(0.isAssignableFrom(JFrame.class)){
//是一个JFrame
}
if(getType(1).isAssignableFrom(String.class)){
//这是一根绳子
}

它似乎是字符串类型,因为这是您扩展的。可能是No的重复,而不是重复…我有一个“List”,其中T由实现类指定。添加了示例代码我正在尝试执行的操作。该代码示例在哪里?在
子类中?是否可以添加
List getValues()
Child
中的方法应该给你一个
列表
?这有用吗?抱歉,这似乎有点难以描述。我在顶部添加了几行。我正在为现有类编写代码生成器。我随机选取了一个示例(父类、子类),来描述我的具体问题:当我得到Child#setValues()的genericParameterTypes时,我得到的是“List”,而不是“List”。但是我需要为我生成的方法提供List。
private Class<T> getType(int index) {
    final ParameterizedType parameterizedType = (ParameterizedType) getClass().getGenericSuperclass();
    return (Class<T>) parameterizedType.getActualTypeArguments()[index];
}
Foo42<JFrame,String> foo = new Foo42<>();

if (getType(0).isAssignableFrom(JFrame.class)) {
    // is a JFrame
}

if (getType(1).isAssignableFrom(String.class)) {
    // is a String
}