1. 需求背景

我所做的项目中,使用了阿里云ONS作为消息中间件。在写Topic消费时,需要实现MessageListener的consume()方法,此方法中message参数的body成员变量是byte[]类型,因为项目约定使用json作为消息传递的序列化方式,故有想法通过模板方法,进行统一的byte[]到类对象的转换。在转换时遇到了问题,怎样获取到方法所在类上,泛型的实际类型。

2. 实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
* 获取泛型的类
* @return
*/
private Type getType() {
return ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
}
/**
* 获取泛型的类
* @return
*/
@SuppressWarnings("unchecked")
private Class<T> getTClass() {
return (Class<T>)((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
}

3. 相关方法

  • java.lang.Class#getGenericSuperclass()

    返回Type表示此所表示的实体(类,接口,基本类型或void)的直接超类

    如果超类是参数化类型,返回的Type对象必须准确反映源代码中使用的实际类型参数。 如果以前没有创建表示超类的参数化类型。 有关参数化类型创建过程的语义,请参见ParameterizedType的声明 。 如果这个表示Object类,接口,原始类型或void,则返回null。 如果此对象表示数组类,则返回表示Object类的对象。

  • java.lang.reflect.ParameterizedType#getActualTypeArguments()

    返回一个表示此类型的实际类型参数的数组Type对象。

    请注意,在某些情况下,返回的数组为空。 如果此类型表示嵌套在参数化类型中的非参数化类型,则可能会发生这种情况。