java reflection
泛型
java 泛型存在类型擦除(参见 java 泛型)
1 | List<String> l1 = new ArrayList<String>(); |
获取运行时泛型类型
类型擦除使得根据类定义获取 runtime 泛型类型是不可能的,一般有几种方法(参见 stackoverflow):
- 根据类对象实例获取,可参见 handle java generic types with reflection
- eg.
Class<T> tClass = (Class<T>) ReflectionUtil.getClass(ReflectionUtil.getParameterizedTypes(this)[0]);
- eg.
- 从父类中获取(要求父类有相同的泛型参数)
- eg.
Class<T> tClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]
- eg.
- 通过方法存储泛型类型为 field。但这意味着所有的 client 都必须要通过相应方法设置该 field
1 | // 通过方法(constructor)存储泛型类型 |
获取一个带泛型信息的 class 变量
例如当使用 new ObjectMapper().readValue(string, someClass)
,而 someClass 是包含泛型参数的类型(eg. List
参见 stackOverflow,总结如下:
1 | import com.fasterxml.jackson.databind.ObjectMapper; |