不求流芳百世,只求口碑载道
写在前面的话
Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。泛型的本质是参数化类型
,也就是说所操作的数据类型被指定为一个参数。
一、操作泛型相关
写一个实体类DictResponse
public class DictResponse{
private Long id;
private String name;
private BigDecimal price;
private List<DemoResponse> demoResponseList;
// 忽略构造函数和get,set方法
}
DictResponse类中有一个字段为泛型List,所以可以获取该字段然后拿到泛型参数类型
// java.util.List<reflect.demoResponse>
private static void getDeneric() {
Field[] declaredFields = DictResponse.class.getDeclaredFields();
for (Field declaredField : declaredFields) {
if (declaredField.getType() == List.class) {
System.out.println(declaredField.getGenericType());
}
}
}
发现参数DemoResponse还是一个类里面还有字段,reflect是我自定义的包名
private static void getDeneric() throws ClassNotFoundException {
Field[] declaredFields = DictResponse.class.getDeclaredFields();
for (Field declaredField : declaredFields) {
if (declaredField.getType() == List.class) {
// 打印泛型类型 java.util.List<reflect.DemoResponse>
System.out.println(declaredField.getGenericType());
// 获取参数化类型 reflect.DemoResponse
ParameterizedType listGenericType = (ParameterizedType)declaredField.getGenericType();
Type actualTypeArguments = listGenericType.getActualTypeArguments()[0];
System.out.println(actualTypeArguments.getTypeName());
// 发现参数 DemoResponse还是一个类里面还有字段,reflect是我自定义的包名
String typeName = actualTypeArguments.getTypeName();
if (typeName.startsWith("reflect")) {
Field[] fields = Class.forName(typeName).getDeclaredFields();
for (Field field : fields) {
System.out.println(field);
}
}
}
}
}
这篇文章写的感觉是为了写文章而写的文章,并没有实质性的作用只是单纯的介绍一下获取泛型的操作步骤,后面会利用前面这些讲到的技术点写一篇调用远程rpc接口的实战性的文章。