利用反射机制实现对象转Map集合

分析问题

问题主要有如下几点java

  • 如何获取对象中的属性的名称?
  • 如何获取对象的属性值?如何这个属性被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>,app

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 对了 小白勿进 最好是有开发经验大数据

注:加群要求

一、具备工做经验的,面对目前流行的技术不知从何下手,须要突破技术瓶颈的能够加。

二、在公司待久了,过得很安逸,但跳槽时面试碰壁。须要在短期内进修、跳槽拿高薪的能够加。

三、若是没有工做经验,但基础很是扎实,对java工做机制,经常使用设计思想,经常使用java开发框架掌握熟练的,能够加。

四、以为本身很牛B,通常需求都能搞定。可是所学的知识点没有系统化,很难在技术领域继续突破的能够加。

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

相关文章
相关标签/搜索