反射超详细(二)——操作泛型

不求流芳百世,只求口碑载道

写在前面的话

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接口的实战性的文章。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容