我有一个通用的静态方法,我希望它返回插入的实际泛型类型的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]))
我的代码和代码之间的区别在于他们称之为在类中查找泛型类型 - 我希望它在方法中使用。
我的代码不起作用,它属于(类)转换行。
您对如何从静态方法获取当前泛型类型有任何想法吗?
感谢
答案 0 :(得分:0)
它无效。你得到方法getClass
,它基本上有返回类型Class<CommonTools>
,然后你调用getActualTypeArguments
,它将返回Class<CommonTools>
,因为TypeArgument是CommonTools。
如果你打电话给Class<CommonTools> ct = getClassType();
它会起作用,但是没有必要提供这样的信息。
据我所知,由于JVM在运行时删除了所有通用信息,因此无法获取该信息。
最简单的解决方案是CommonTools
将在创建时获得Class<T>
个实例,并将返回它,但之后并不常见。