在静态方法中获取实际泛型类的类对象

时间:2014-10-22 13:05:16

标签: java generics types static

我有一个通用的静态方法,我希望它返回插入的实际泛型类型的Class对象。

我试过这样的话:

@SuppressWarnings("unchecked")
public static <T> Class<T> getClassType() {

    Method thisMethod;
    try {
        thisMethod = CommonTools.class.getMethod("getClass", new Class<?>[0]);
    } catch (Exception ex) {
        //ErrorLog.error(ex.getMessage(), ex);
        return null;
    }

    Type returnType = thisMethod.getGenericReturnType();
    Type tType = returnType.getClass().getGenericSuperclass();
    ParameterizedType parameterizedType = (ParameterizedType) tType;
    Class<T> clazz = (Class<T>) parameterizedType.getActualTypeArguments()[0];

    return clazz;
}

我的灵感来源于谷歌代码morphia库,在那里他们使用了这样的东西:

(((Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]))

我的代码和代码之间的区别在于他们称之为在类中查找泛型类型 - 我希望它在方法中使用。

我的代码不起作用,它属于(类)转换行。

您对如何从静态方法获取当前泛型类型有任何想法吗?

感谢

1 个答案:

答案 0 :(得分:0)

它无效。你得到方法getClass,它基本上有返回类型Class<CommonTools>,然后你调用getActualTypeArguments,它将返回Class<CommonTools>,因为TypeArgument是CommonTools。

如果你打电话给Class<CommonTools> ct = getClassType();它会起作用,但是没有必要提供这样的信息。

据我所知,由于JVM在运行时删除了所有通用信息,因此无法获取该信息。 最简单的解决方案是CommonTools将在创建时获得Class<T>个实例,并将返回它,但之后并不常见。