利用反射机制实现对象转map集合(代码片段)

author author     2023-01-30     551

关键词:

分析问题
问题主要有以下几点

如何获取对象中的属性的名称?
如何获取对象的属性值?如何这个属性被private修饰,该如何处理?
返回的是一个对象该如何获取对象的属性参数呢?

解决问题

问题1:可以使用反射来获取POJO对象的get方法(当然包括boolean类型的is方法),然后来处理成为属性,主要逻辑是分析是否包以is或者get关键字开头,如果是的话那么返回处理后的数据信息。转换简略代码如下:

/**
     * 处理方法,将get方法转换为属性名
     *
     * @param methodName
     * @return
     */
    public static String dealMethodName(String methodName) 
        StringBuilder stringBuilder = new StringBuilder();
        if (methodName.startsWith("get")) 
            stringBuilder.append(methodName.toLowerCase().charAt(3)).append(methodName.substring(4));
         else if (methodName.startsWith("is")) 
            stringBuilder.append(methodName.toLowerCase().charAt(2)).append(methodName.substring(3));
         else 
            return methodName;
        
        return stringBuilder.toString();
    

问题2:由于可以获取到POJO对象的get方法,因此我们可执行这个方法来进行获取到结果,从而也避免了private修饰的问题。
问题3:如果使用get方法获取过来的是一个对象,那么我们可以通过判断是不是Object类来判断是不是需要迭代处理,后来发现,在使用一些基础数据类的时候,比如int,char,float等,他会自定的装箱,从而导致我们无法处理,后来取了一个折中的办法自定义了一个注解,在返回值是POJO对象的地方标注,在使用反射获取get方法中获取这个注解,如果注解是null说明不是POJO,如果不是null,那么我们进行二次的迭代处理该对象,注解代码如下:

//作用于方法上,运行时保留
@Target(value=METHOD)
@Retention(RetentionPolicy.RUNTIME)
public  @interface NeedIterative 
    //参数没有作用
    String value() default "";

详细代码
首先实现POJO类,POJO类主要代码如下所示<span style="color:red;">set方法已省略,自行补充,People类也是</span>

public class Student
    private String name;
    private int age;
    private float height;
    private double weight;
    private char sex;
    private boolean allow;
    private People people;

    public Student(String name, int age, float height, double weight, char sex, boolean allow) 
        this.name = name;
        this.age = age;
        this.height = height;
        this.weight = weight;
        this.sex = sex;
        this.allow = allow;
    

    public String getName()  return name;

    public int getAge()   return age; 

    public float getHeight()  return height;

    public double getWeight() return weight;

    public char getSex() return sex;

    public boolean isAllow()  return allow;

    //此处添加了注解,说明此处返回的是一个POJO需要迭代处理
    @NeedIterative
    public People getPeople()  return new People("李亚伟",12); 

需要返回的对象POJO对象是People类的代码内容为

public class People
    private String people;
    private int work;

    public People(String people, int work) 
        this.people = people;
        this.work = work;
    

    public String getPeople()  return people; 

    public int getWork()  return work; 

反射返回对象
代码很见到,都是Class等常见的API,这里不做赘述。

public static  Map toMap(Object obj) throws Exception 
        Class clazz = obj.getClass();
        //获得属性
        Field[] fields = obj.getClass().getDeclaredFields();
        HashMap hashMap = new HashMap(fields.length);
        for (Field field : fields) 
            PropertyDescriptor pd = new PropertyDescriptor(field.getName(), clazz);
            //获得get方法
            Method getMethod = pd.getReadMethod();
            //执行get方法返回一个Object
            Object exeValue = getMethod.invoke(obj);
            String key = dealMethodName(getMethod.getName());
            NeedIterative annotation = getMethod.getAnnotation(NeedIterative.class);
             //获取的注解不为空,那么说明此处返回的结果是对象,那么需要迭代处理
            if (annotation != null) 
                exeValue = toMap(exeValue);
            
            hashMap.put(key, exeValue);
        
        return hashMap;
    

输出结果
由此可见,不管是基本数据类型,还是POJO类都能正常的转换。

断点数据类型查看:
技术分享图片
sout输出效果如下:


        allow=true, 
        sex=m,
        name=周涛,
        weight=12.23,
        people=
                people=李亚伟, 
                work=12
                ,
        age=23,
        height=12.12

感兴趣可以加Java架构师群获取Java工程化、高性能及分布式、高性能、深入浅出。高架构。性能调优、Spring,MyBatis,Netty源码分析和大数据等多个知识点高级进阶干货的直播免费学习权限 都是大牛带飞 让你少走很多的弯路的 群..号是:855801563 对了 小白勿进 最好是有开发经验

注:加群要求

1、具有工作经验的,面对目前流行的技术不知从何下手,需要突破技术瓶颈的可以加。

2、在公司待久了,过得很安逸,但跳槽时面试碰壁。需要在短时间内进修、跳槽拿高薪的可以加。

3、如果没有工作经验,但基础非常扎实,对java工作机制,常用设计思想,常用java开发框架掌握熟练的,可以加。

4、觉得自己很牛B,一般需求都能搞定。但是所学的知识点没有系统化,很难在技术领域继续突破的可以加。

5.阿里Java高级大牛直播讲解知识点,分享知识,多年工作经验的梳理和总结,带着大家全面、科学地建立自己的技术体系和技术认知!

java中map和对象互转工具类的实现示例

...96061626364656667686970717273747576777879/**     *利用反射将map集合封装成bean对象     *     *@paramparams     *@paramclazz   & 查看详情

045-利用反射机制,简单的实现php插件模式(代码片段)

<?php//利用反射机制,简单的实现PHP插件模式#假设,我们有一款开源产品,所有开发者都必须在我定制的需求之上,进行二次开发,#而开发完成后的新模块,就是一个不一样的新插件,可以放在特定的位置进行自动加载#这是... 查看详情

go基础面向对象和反射机制(代码片段)

...对象1.面向对象的概念2.构造函数3.继承与重写4.泛型二、反射1.反射介绍2.反射的基础数据类型3.反射API3.1reflect.Type①如何得到Type②指针Type转为非指针Type③获取struct成员变量的信息④获取struct成员方法的信息⑤获取函数的信息⑥... 查看详情

反射机制的应用和获得反射对象(代码片段)

反射机制的应用和获得反射对象Java反射优点和缺点优点可以实现动态创建对象和编译,体现出很大的灵活性缺点对性能有影响。使用反射基本上是一种解释操作,我们可以告诉JVM,我们希望做什么并且它满足我们的要求。这类... 查看详情

模拟dbutils中的queryrunner.query()的反射机制的模拟(代码片段)

...结构: DBUtilsReflection类:/***将查询到的结果集,运用反射机制,创建对象,并存放如集合中*resultSet->admin对象->list集合*/publiccla 查看详情

利用java反射机制实现对象相同字段的复制

一。如何实现不同类型对象之间的复制问题?1、为什么会有这个问题?近来在进行一个项目开发的时候,为了隐藏后端数据库表结构、同时也为了配合给前端一个更友好的API接口文档(swaggerAPI文档),我采用POJO来对应数据表结... 查看详情

反射机制(reflection)(代码片段)

...aScript、PHP、Python静态语言运行时结构不可改变Java、C、C++利用反射机制可以使Java获得类似动态语言的特性2.反射反射机制在执行期间借助ReflectionAPI可以取得任何类的内部信息并能直接操作任意对象的内部属性及方法(包括private... 查看详情

java的反射机制入门(代码片段)

理解Java的反射机制对学习Java框架有很大帮助,比如Spring框架的核心就是使用Java反射实现的,同时对做一些Java底层操作也会有帮助,比如字节码操作、自定义注解等。什么是反射Java反射说的是在运行状态中,对于任何一个类,... 查看详情

go基础面向对象和反射机制(代码片段)

...对象1.面向对象的概念2.构造函数3.继承与重写4.泛型二、反射1.反射介绍2.反射的基础数据类型3.反射API3.1reflect.Type①如何得到Type②指针Type转为非指针Type③获取struct成员变量的信息④获取struct成员方法的信息⑤获取函数的信息⑥... 查看详情

反射(代码片段)

概念Java反射机制是在运行状态中对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用这个对象的所有属性和方法。这种动态获取信息以及动态调用对象的功能称为Java语言的反射机制。即,通... 查看详情

利用stream对map集合进行过滤(代码片段)

...空字符串等操作这里我简单画了个图,对这个过程总结1.利用filter对null和空字符串进行过滤2.利用map进行对于Stream中包含的元素 查看详情

java基础整理-80.java反射机制(代码片段)

Java什么是反射机制?反射机制的概念  在ORM(ObjectRelationalMapping 对象关系映射)中间件的实现中,运用java反射机制可以读取任意一个JavaBean的所有属性,或者给这些属性赋值。ClasslabelCls=label1.getClass();//label1为JLabel类的对象Jav... 查看详情

java反射反射实现判断发生了修改操作,判断两个对象是否发生属性值的变更,判断两个list集合内对象的属性值是否发生变更(代码片段)

java的反射实现:判断发生了修改操作,判断两个对象是否发生属性值的变更,判断两个List集合内对象的属性值是否发生变更 今日份代码:packagecom.sxd.streamTest;importjava.lang.reflect.Field;importjava.util.*;/***@ClassNameTest*@Description判断... 查看详情

[转]java反射机制详解

目录1反射机制是什么2反射机制能做什么3反射机制的相关API·通过一个对象获得完整的包名和类名·实例化Class类对象·获取一个对象的父类与实现的接口·获取某个类中的全部构造函数-详见下例·通过反射机制实例化一个类的对... 查看详情

利用反射手写对象属性复制(代码片段)

因为在工作中经常用到BeanUtils.copyProperties(userInfo,userInfoVO);所以就想着试试看自己的反射水平怎么样?能不能自己也写个一样的功能?所以我就写了个如下方法,虽然在很多方面还需要优化,但是基本功能是实现了... 查看详情

javase——反射(代码片段)

...的功能称为Java语言的反射机制。通俗的理解:(掌握)利用反射创建的对象可以无视修饰符调用类里面的内容可以跟配置文件结合起来使用,把要创建的对象信息和方法写在配置文件中。读取到什么类,就创建什么类的对象读... 查看详情

java反射机制快速入门及常见方法全归纳。(代码片段)

目录一、反射机制1、基本介绍2、原理示意图3、反射基本代码实现4、反射性能 二、Class类1、基本介绍2、获取Class类对象的方式3、有Class对象的类三、类加载1、基本介绍2、连接阶段四、常见方法取类的结构信息1、常用类的方法... 查看详情

java基础之详解java反射机制(代码片段)

一、什么是Java的反射机制???反射(Reflection)是Java的高级特性之一,是框架实现的基础,定义:JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个... 查看详情