反射小练习
来源:互联网 发布: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
阅读全文
2 0
- 反射小练习
- Java反射小练习
- Java反射小练习
- 反射小练习
- golang反射小练习
- 反射——小练习
- 反射练习
- 反射练习
- 反射练习
- 反射练习
- 反射练习
- 反射练习
- 反射练习
- 小练习
- 小练习
- 小练习
- 小练习
- 小练习
- vue-cli中使用less的方式!
- 初学xpath 解决如何获取子孙节点的文本内容
- RC4加密
- qt下的跨目录多工程编译
- python学习笔记——列表
- 反射小练习
- Centos6和Ubuntu 下安装nvm和nodeJS开发环境
- MariaDB and MySQL Common Table Expressions and Window Functions Revealed.pdf 英文原版 免费下载
- C++ lambda 表达式
- c语言中函数声明的作用
- bootstrap之form样式
- java操作redis(二):存取对象操作
- 一个月过去了
- Beginning Java 9 Fundamentals, 2nd Edition.pdf 英文原版 免费下载