【问题标题】:How to get main type of generic field with reflection in java?java - 如何在java中通过反射获得主要类型的泛型字段?
【发布时间】:2015-09-15 00:14:46
【问题描述】:

假设我的项目中有以下这些类:

public class MyBaseEntity<T> {
    T   id;
}

public class MySubClass extends MyBaseEntity<Long> {

}

现在,我想通过 java 反射获取 id(java.lang.Long) 字段的主要类型MySubClass,我该怎么做?

更新

我为此更改了课程并添加了 2 个新的Class

public class MySubClass3 extends MyBaseEntity<Integer> {

}

public class MySubClass2 extends MySubClass3 {

}

public class MySubClass extends MySubClass2 {

}

现在,我如何获取 id 的主要类型,换句话说,如果继承深度是动态的,我如何获取特定类的 id 的主要类型?

【问题讨论】:

  • 只有当你真正为它分配Long 时,你才能做到这一点。在类型擦除之后,变量本身的类型为Object

标签: java generics reflection code-generation freemarker


【解决方案1】:

将类型传递给基类的构造函数

public MyBaseEntity(Class<?> clazz) {
    this.clazz = clazz;
}

【讨论】:

    【解决方案2】:

    好吧,您可以在运行时定义哪个类用于MyBaseEntityT 参数,方法如下:

    Type type = MySubClass.class.getGenericSuperclass();
    if(type instanceof ParameterizedType) {
        Type parameterType = ((ParameterizedType) type).getActualTypeArguments()[0];
        if(parameterType instanceof Class) {
            System.out.println(((Class<?>)parameterType).getName());
            // prints java.lang.Long
        }
    }
    

    但这是很容易出错的方法。你可能有更棘手的继承或使用像class SubClass&lt;T extends Number&gt; extend MyBaseEntity&lt;T&gt; 这样的通配符,你将不得不特别处理这种情况。因此,我建议您使用@Reimeus 建议的方法。

    【讨论】:

    • 谢谢,你知道我如何在 freemarker 模板中使用它吗?
    【解决方案3】:

    使用TypeTools

    Class<?> type = TypeResolver.resolveRawArgument(MySubClass.class, MyBaseEntity.class);
    assert type == Integer.class;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多