• BeanUtils工具的实现


    BeanUtils工具的实现

    自定义一个将数据映射到类里的方法

    方法一:

    package utils;
    
    import java.lang.reflect.Field;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    import java.util.Map;
    
    /**
     * @author: 肖德子裕
     * @date: 2018/8/28 21:48
     * @description: 数据反射封装工具类
     */
    public class BeanUtils {
        public static <T> T populate(Class<T> cls, Map<String, Object> map) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException {
            T obj = null;
    
            //1、用类反射new出对象
            obj = cls.newInstance();
    
            //2 再用类反射对新new的对象设置属性值(必须遵守Java设置规范)--即通过setter方法设置
            //2.1遍历出所有该类声明的属性
            Field flds[] = cls.getDeclaredFields();//getDeclaredFields()返回Class中所有的字段,包括私有字段;
            for (Field fld : flds) {
                //获取该fld对象所代表的属性名
                String fldName = fld.getName();
                //根据属性名,到map中去读取数据,只有数据非空才需要给该属性设置值
                Object value = map.get(fldName);
                if (value == null) {//如果map中不存在对应的属性数据,我们在这里给出提示信息
                    System.out.println(fldName + "的数据为空");
                } else {
                    //如果map中存在对应的属性数据,则由属性名得出它的setter方法的名字
                    String mothodName = "set" + fldName.substring(0, 1).toUpperCase() + fldName.substring(1);
    
                    //根据方法名和参数的数据类型(其实就是属性的类型),获得Method对象
                    Class<?> paramTypes[] = new Class[1];
                    paramTypes[0] = fld.getType();
                    Method method = cls.getDeclaredMethod(mothodName, paramTypes);
    
                    //调用该method对象所代表的方法
                    Object args[] = new Object[1];
                    args[0] = value;
                    method.invoke(obj, args);
                }
            }
            return obj;
        }
    }

     

    方法二:

    package utils;
    
    import java.lang.reflect.Field;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.Map;
    
    public class FormUtil {
    
        public static Object convert(Map<String, String[]> map, Class<?> clazz) {
            Object instance = null;
            try {
                instance = clazz.newInstance();
                for (Field field : clazz.getDeclaredFields()) {
                    String[] values = map.get(field.getName());
                    if (values != null) {
                        Object val = convertValue(field.getType(), values[0]);
                        field.setAccessible(true);
                        field.set(instance, val);
                    }
                }
            } catch (InstantiationException e) {
                throw new RuntimeException(e.getMessage());
            } catch (IllegalAccessException e) {
                throw new RuntimeException(e.getMessage());
            }
            return instance;
        }
    
        private static Object convertValue(Class<?> fieldType, String value) {
            Object val = null;
            if ("".equals(value) && !fieldType.equals(String.class)) {
                throw new RuntimeException("input "" can not convert to " + fieldType);
            } else if (fieldType.equals(String.class)) {
                val = value;
            } else if (fieldType.equals(Integer.TYPE) || fieldType.equals(Integer.class)) {
                val = Integer.valueOf(value);
            } else if (fieldType.equals(Byte.TYPE) || fieldType.equals(Byte.class)) {
                val = Byte.valueOf(value);
            } else if (fieldType.equals(Short.TYPE) || fieldType.equals(Short.class)) {
                val = Short.valueOf(value);
            } else if (fieldType.equals(Character.TYPE) || fieldType.equals(Character.class)) {
                val = Character.valueOf(value.charAt(0));
            } else if (fieldType.equals(Boolean.TYPE) || fieldType.equals(Boolean.class)) {
                val = Boolean.valueOf(value);
            } else if (fieldType.equals(Long.TYPE) || fieldType.equals(Long.class)) {
                val = Long.valueOf(value);
            } else if (fieldType.equals(Float.TYPE) || fieldType.equals(Float.class)) {
                val = Float.valueOf(value);
            } else if (fieldType.equals(Double.TYPE) || fieldType.equals(Double.class)) {
                val = Double.valueOf(value);
            } else if (fieldType.equals(Date.class)) {
                try {
                    val = new SimpleDateFormat("yyyy-MM-dd").parse(value);
                } catch (ParseException e) {
                    throw new RuntimeException(e.getMessage());
                }
            }
            return val;
        }
    }

     

    方法三:

    package utils;
    
    import java.lang.reflect.Field;
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    import java.util.Map;
    
    /**
     * @author: 肖德子裕
     * @date: 2018/8/28 22:22
     * @description: 数据反射封装工具类2
     */
    public class BeanUtils2 {
        public static Object populate(Class cls, Map map) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchMethodException, SecurityException {
            Object obj = null;
    
            //1、用类反射new出对象
            obj = cls.newInstance();
    
            //2 再用类反射对新new的对象设置属性值(必须遵守Java设置规范)--即通过setter方法设置
            //2.1遍历出所有该类声明的属性
            Field flds[] = cls.getDeclaredFields();//getDeclaredFields()返回Class中所有的字段,包括私有字段;
            for (Field fld : flds) {
                //获取该fld对象所代表的属性名
                String fldName = fld.getName();
                //根据属性名,到map中去读取数据,只有数据非空才需要给该属性设置值
                Object value = map.get(fldName);
                if (value == null) {//如果map中不存在对应的属性数据,我们在这里给出提示信息
                    System.out.println(fldName + "的数据为空");
                } else {
                    //如果map中存在对应的属性数据,则由属性名得出它的setter方法的名字
                    String mothodName = "set" + fldName.substring(0, 1).toUpperCase() + fldName.substring(1);
    
                    //根据方法名和参数的数据类型(其实就是属性的类型),获得Method对象
                    Class paramTypes[] = new Class[1];
                    paramTypes[0] = fld.getType();
                    Method method = cls.getDeclaredMethod(mothodName, paramTypes);
    
                    //调用该method对象所代表的方法
                    Object args[] = new Object[1];
                    args[0] = value;
                    method.invoke(obj, args);
                }
            }
            return obj;
        }
    }

     

  • 相关阅读:
    [CTF]zip伪加密
    Node.js躬行记(5)——定时任务的调试
    不一样的资产安全 3D 可视化平台
    冬季里有温度的 3D 可视化智慧供热系统
    公路项目建设可视化进度管理
    ElementUI时间选择控件提交的时间为UTC时间
    Orcal创建触发器
    Orcal常用查询实例集合
    代码优化风格分享
    查某月的天数
  • 原文地址:https://www.cnblogs.com/xdzy/p/9584079.html
Copyright © 2020-2023  润新知