java - 在方法中重用时如何获取类的泛型类型 "T"

标签 java reflection sun-codemodel jcodemodel

我正在为 Fluent API 构建代码生成器。我想为每个现有的 (POJO) 类创建一个新类。我没有我控制的现有类(class)。我通过反射解析现有方法,如果我遇到 setter 或“添加”方法,我会在我的 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”映射回字符串。但是我无法弄清楚如何通过实现“子”来获得具体的类型“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()));
    }

  }
}

最佳答案

如果您使用我的 TypeTools库,这变得非常简单:

Class<?> t = TypeResolver.resolveRawArgument(Parent.class, Child.class);

关于java - 在方法中重用时如何获取类的泛型类型 "T",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17819803/

相关文章:

Java MAC地址授权

java - 在 Android 4 上设置 FrameLayout 背景时出错

java - 使用final关键字引用并在定时器中使用,引用的对象无法删除?

c# - 使用反射调用 DLL,但所需的另一个 DLL 抛出异常

reflection - 数据映射代码还是反射代码?

java - 如何使用 CodeModel 调用第二级抽象父类(super class)的方法?

java - 如何创建 <?用 JCodeModel 扩展子类型>?

java - selenium webdriver 不从 java 中的 css 选择器返回值

java - NoClassDefFoundError:注释处理期间的 org/junit/AfterClass

java - 如何检查类是否已使用 Kotlin 或 Java 中的反射覆盖接口(interface)中的默认方法?