【BeanUtils】自己写的一个BeanUtils-代码方法详解(2)

简介: 【BeanUtils】自己写的一个BeanUtils-代码方法详解

最终版:

MyBeanUtils

package cn.hncu.beanUtils;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Map;
public class MyBeanUtils {
    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;
    }
}

测试方法:

@Test
    @SuppressWarnings("unchecked")
    public void test() {
        Map<String, Object> map = new HashMap();
        map.put("uuid", "001");
        map.put("name", "Jack");
        map.put("age", 20);
        Map<String, Object> map2 = new HashMap();
        map2.put("uuid", "001");
        map2.put("name", "红楼梦");
        map2.put("inPrice", 20.5);
        //数据可能不全
        map2.put("num", 123);
        try {
            User user = MyBeanUtils.populate(User.class, map);
            System.out.println(user);
            Book book = MyBeanUtils.populate(Book.class, map2);
            System.out.println(book);
        } catch (ReflectiveOperationException e) {
            e.printStackTrace();
        }
    }

测试结果:

image.png

完整项目源码链接:

–>点击访问本系列源码–

目录
相关文章
C++音视频编程探秘
C++音视频编程探秘
335 1
学习 XQuery:XML数据查询的关键
XQuery是用于查询XML数据的语言,类似SQL对数据库的操作。它基于XPath构建,用于从XML文档中提取和排序元素。FLWOR表达式(For, Let, Where, Order by, Return)是其核心,用于处理和过滤数据。例如,示例代码展示了如何选取&quot;books.xml&quot;中价格大于30的书籍并按标题排序。XQuery还可用于Web服务、生成报告、XML到XHTML转换及搜索文档等场景。了解XPath能帮助更好地掌握XQuery,两者有相似的数据模型和函数。
211 0
挑战未来职场:亲手打造你的AI面试官——基于Agents的模拟面试机器人究竟有多智能?
【10月更文挑战第7天】基于Agent技术,本项目构建了一个AI模拟面试机器人,旨在帮助求职者提升面试表现。通过Python、LangChain和Hugging Face的transformers库,实现了自动提问、即时反馈等功能,提供灵活、个性化的模拟面试体验。相比传统方法,AI模拟面试机器人不受时间和地点限制,能够实时提供反馈,帮助求职者更好地准备面试。
529 2
Kafka与大数据:消息队列在大数据架构中的关键角色
【4月更文挑战第7天】Apache Kafka是高性能的分布式消息队列,常用于大数据架构,作为实时数据管道汇聚各类数据,并确保数据有序传递。它同时也是数据分发枢纽,支持多消费者订阅,简化系统集成。Kafka作为流处理平台的一部分,允许实时数据处理,满足实时业务需求。在数据湖建设中,它是数据入湖的关键,负责数据汇集与整理。此外,Kafka提供弹性伸缩和容错保障,适用于微服务间的通信,并在数据治理与审计中发挥作用。总之,Kafka是现代大数据体系中的重要基础设施,助力企业高效利用数据。
578 1
DNS 定期刷新缓存
【8月更文挑战第18天】
539 2
【MySQL】read_rnd_buffer_size=4M,是干什么的?底层原理是什么?
【MySQL】read_rnd_buffer_size=4M,是干什么的?底层原理是什么?
1311 0
AI程序员革命:探析Devin的登场与编程未来
AI程序员革命:探析Devin的登场与编程未来
309 0
利用机器学习优化数据中心的能效
【5月更文挑战第25天】 在数据中心的设计与运维中,能效管理是至关重要的一环。随着人工智能技术的进步,特别是机器学习(ML)算法的发展,我们现在有能力更精确地预测数据中心的能源需求,并实时调整资源分配以优化能耗。本文将探讨一种基于机器学习的方法,用于动态调节数据中心的冷却系统和服务器负载,以达到节能降耗的目的。通过分析历史数据和实时反馈,该方法能够显著降低不必要的能源开支,同时确保数据中心的性能不受影响。
登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问