反射小练习

来源:互联网 发布:php 数组元素相加 编辑:程序博客网 时间:2024/05/23 17:34

反射小练习

前言

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


问题的描述

简单描述一下,在自己的工作之中,遇到这样子的问题:发送报文,然后从对方那里获取报文,报文解析后将其数据赋值给 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-062017-11-07

后记

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

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

编辑:HochenChong

时间:2017-11-06

原创粉丝点击