java 基础 | 通过反射获取泛型及父类的属性

本贴最后更新于 1777 天前,其中的信息可能已经水流花落

javaDEMO

Java 基础 Demo 站: https://www.javastudy.cloud
Java 中高级开发博客: https://www.lixiang.red
Java 学习公众号: java 技术大本营
java_subscribe

本篇知识点

  1. 反射获取实体类属性
  2. 反射获取实体类父类
  3. 反射获取实体类的泛型信息
  4. 递归的写法

通过反射获取父类的属性

在上篇文章中我们讲到,如果通过反射去获取实体类的属性,但是那种是只获得当前实体类的属性
文章参考: https://www.javastudy.cloud/articles/2019/12/12/1576106432418.html
在实际开发中,我们的 DTO,QC 大多数都会继承一个 BaseDTO 或者一个 BaseQC , 来避免一些重复属性的编写,那么这时候我们的工具需要把父类的属性也拿到.
DEMO 代码如下:

private static Field[] getAllFields(Class<?> clazz) {
        List<Field> fieldList = new ArrayList<>();
        Class<?> curClazz = clazz;
        while (curClazz != null){
            fieldList.addAll(Arrays.asList(curClazz.getDeclaredFields()));
            //获取当前类的父类
            curClazz = curClazz.getSuperclass();
        }
        return fieldList.toArray(new Field[0]);
    }

通过反身获取泛型的属性

在实际开发中, 我们的返回值经常会用 BaseResponse 包装一下,BaseResponse 提供 code , message,success 这些通用的返回格式,然后再加一个 T data.如下所示:
image.png
如下 controller 中, 这个 T 的实际类型是 ArticleDO,我们要通过反射,拿到 ArticleDO 的属性
image.png
DEMO 代码如下:其主要思路还是使用递归来解决

public static Map<String, List<String>> getGenericTypeFields(Type type){
        Map<String, List<String>>  exitsMap  = new LinkedHashMap<>();
        if(type instanceof  ParameterizedType){
            //如果是泛型,则调用泛型的处理方法
            doGetGenericTypeFields(type,exitsMap);
        }else {
            //如果不是泛型,则直接调用实体类的获取属性值的方式
            doGetModelFields((Class<?>) type,exitsMap);
        }
        return exitsMap;
    }

    /**
     * 处理泛型的方法
     */
    public static void doGetGenericTypeFields(Type type,Map<String,List<String>> map){
            ParameterizedType parameterizedType =(ParameterizedType) type;
            map.putAll(getModelFields((Class<?>) parameterizedType.getRawType()));
            Type[] typeArguments = parameterizedType.getActualTypeArguments();
            for (Type argument : typeArguments) {
                if(argument instanceof Class){
                   map.putAll(getModelFields((Class<?>) argument));
                }else{
		    // 这里使用递归继续处理泛型的情况
                    doGetGenericTypeFields(argument,map);
                }
            }

    }

DEMO 测试

如,我们现在有一个返回值为:
image.png
BaseResponse 结构如文中所示, PageData 结构如下所示:
image.png
也就是说, 这里有两层泛型嵌套,运行 DEMO 可得到如下结果:
可以看到,信息都已被获取到
image.png

DEMO 总评

写完这个 DEMO , 反射对 Field 和泛型的操作大致就是这些了, 掌握这个 DEMO,就离掌握反射不远了, 这个也是为自动生成方法文档做准备的, 有了这个方法后, 就可以处理方法的入参和回参,下面开始着手写自动生成文档的工具类

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3187 引用 • 8213 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...