反射小练习

反射小练习

前言

最近通过视频学习了一下反射,在实际工作之中遇到了一些小问题,于是乎就想着通过反射来解决问题。在业余时间里头,自己写个工具类来玩玩。


问题的描述

简单描述一下,在自己的工作之中,遇到这样子的问题:发送报文,然后从对方那里获取报文,报文解析后将其数据赋值给 JavaBean;

发送过来的日期格式,他们统一是 yyyyMMdd 的格式;

而我们接收的对象,日期则以 String 类型接收,命名大多以 Date 结尾;

一个 JavaBean 之中有时候有很多条日期;

在前端页面显示时,则要求 yyyy-MM-dd;

已有的一个工具类,则是传入一个字符串(yyyyMMdd 格式),返回一个 yyyy-MM-dd 格式的字符串,如果某个 JavaBean 之中只有一两条日期,则调用这个方法给成员变量重新赋值即可。可一旦有多条日期需要这样子处理时,却显得麻烦。


设想

写一个工具类,写一个方法,在这个方法之中传入所要日期处理的对象;

通过反射获取所有日期成员变量名称;

递归处理;

通过 public Method getMethod(String name, Class

工具类

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

/**
 * 描述:处理对象中的日期成员变量
 * @author Hochen
 * @date 2017-11-06
 * @version 0.2
 */

public class ObjectDateUtils {
    /**
     * 传入一个对象,将对象中的日期形如 yyyyMMdd 全部转换为 yyyy-MM-dd
     */
    public static void objectDateFormat(Object obj) {
        // 判断传入的对象是否为 null,为 null 则不进行任何操作
        if (null != obj) {
            Class<?> cls = obj.getClass();
            Field[] fields = cls.getDeclaredFields();
            // 为了方便起见,假设对象里的日期以 String 类型存储,命名之中包含 date
            // 获取所有日期成员变量的名称,将这些名称存储到 dateNames 之中
            List<String> dateNames = new ArrayList<String>();
            for (Field field : fields) {
                String fieldName = field.getName();
                // 不区分命名之中是否包含大小写的 date
                if (fieldName.toLowerCase().indexOf("date") != -1) {
                    dateNames.add(fieldName);
                }
            }

            for (String dateName : dateNames) {
                try {
                    Method setMet = cls.getMethod("set" + dateName.substring(0, 1).toUpperCase() + dateName.substring(1), String.class);
                    Method getMet = cls.getMethod("get" + dateName.substring(0, 1).toUpperCase() + dateName.substring(1));

                    // 获取原本的日期
                    String date = (String) getMet.invoke(obj);

                    // 简单判断一下日期
                    if (null != date
                            && !"".equals(date)
                            && date.matches("\\d+")
                            && 8 == date.length()) {
                        String newDate = date.substring(0, 4) + "-" + date.substring(4, 6) + "-" + date.substring(6);
                        setMet.invoke(obj, newDate);
                    }
                } catch (Exception e) {
                    // 简单处理异常
                    e.printStackTrace();
                }
            }
        }
    }
}

测试

class Book {
    private String startDate;
    private String endDate;

    public String getStartDate() {
        return startDate;
    }
    public void setStartDate(String startDate) {
        this.startDate = startDate;
    }
    public String getEndDate() {
        return endDate;
    }
    public void setEndDate(String endDate) {
        this.endDate = endDate;
    }
}

public class DateTest {
    public static void main(String[] args) {
        Book book = new Book();
        book.setStartDate("20171106");
        book.setEndDate("20171107");

        // 调用工具类,传入对象
        ObjectDateUtils.ObjectDateFormat(book);

        // 输出结果看看
        System.out.println(book.getStartDate());
        System.out.println(book.getEndDate());

    }
}

运行结果:

2017-11-06
2017-11-07

后记

刚好最近学习到,那就拿来用一下,业余时间里头自己练练手。也想着有些操作不想重复性的劳动。不过因为项目组之中有自己的工具,即使麻烦点,但是毕竟经过了考验,所以项目负责人觉得没必要这样子使用,还是继续老样子写即可。

这个也就当做自己业余时间练手,顺带做下笔记,记录一下自己的成长。

编辑:HochenChong

时间:2017-11-06

猜你喜欢

转载自blog.csdn.net/hochenchong/article/details/78463338