文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

java实现两个对象之间传值及简单的封装

2024-04-02 19:55

关注

java两个对象之间传值及封装

在项目里面使用SSH框架的过程中, 经常涉及到修改,我们只要对部门的部门属性进行修改我们通常的做法是先从数据库把对象查询出来target

再把从页面上传递来的修改过的值封装成为一个对象model,我们需要把model中修改过的属性重新赋值给target,再对target进行保存.完成修改

在这个target.setXxx(model.getXxx)过程中有可能有大量的苦力工作要做,所以我利用反射做了一个简单的封装,只需要传递两个对象,就可以完成重新赋值的过程


  
import java.lang.reflect.Field;
import java.lang.reflect.Method; 

public class Demo {
    //model是从前台接受的数据,封装的对象
    //target是从后台根据id查询到的数据,封装的对象
    public static<T> void setValue(T model,T target) throws Exception {
        //获得实体类
        Class clazz = model.getClass();
        //查看有那些字段
        Field[] fields = clazz.getDeclaredFields();
        //遍历
        for (Field field : fields) {
            //属性的名字
            String fieldName = field.getName();
            //属性的类型
            //Class<?> type = field.getType();
            //再得到getter方法的名字
            String getMethodName = "get" + (fieldName.charAt(0)+"").toUpperCase() + fieldName.substring(1);
            Method getMethod = clazz.getMethod(getMethodName);
            //判断model的哪个属性是否为空,利用get方法
            Object object = getMethod.invoke(model);
            if(object!=null) {
                //不为空就进行赋值
                // 通过属性名,来获取对应的setXXX的名字
                String setMethodName = "set" + (fieldName.charAt(0)+"").toUpperCase() + fieldName.substring(1);
                //这是set方法
                Method setMethod = clazz.getMethod(setMethodName, field.getType());
                //这里需要进行类型的强制转换吗?
                setMethod.invoke(target, object);
            }
        }
    }
}

其实我觉得应该是field.getType,得到参数的类型,根据类型控制对象中值的赋予,而不是简单的使用Object进行赋值.不过经过简单的测试,这个类可以使用,没什么大问题.

这是个简单的封装还有其他的需要的条件可以考虑,可以把这个类封装的更好

2019年8月9日15:23:37

更新,增加了object转成Map的方法和Map转object 的方法,还有一个简单的方法



    public static Map<String, Object> obj2Map(Object object) {
        Map<String, Object> map = new HashMap<>();
        if (object == null) {
            return map;
        }
        Class<?> clazz = object.getClass();
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            field.setAccessible(true);
            String name = field.getName();
            Object o = null;
            try {
                o = field.get(object);
                map.put(name, o);
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        return map;
    }


    public static Map<String, String> handleBean2Map(Object object) throws IllegalAccessException {
        Map<String, String> map = new HashMap<>();
        Class clazz = object.getClass();
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            String name = field.getName();
            String value = String.valueOf(field.get(object));
            map.put(name, value);
        }
        return map;
    }

前端姐姐说

{key:value, key:value, key:value, key:value} 这种形式相对于[ {key:A, value:B},{key:A, value:B}, ]这种不好解析,不是很方便。

所以就有了下面的方法,转换成数组:



    public static <T> List<Map<String, Object>> map2List(Map<String, T> map) {
        List<Map<String, Object>> newList = new ArrayList<Map<String, Object>>();
        if (map == null || map.size() < 1) {
            return newList;
        }
        for (Entry<String, T> entry : map.entrySet()) {
            Map<String, Object> hashMap = new HashMap<String, Object>(2);
            hashMap.put("key", entry.getKey());
            hashMap.put("value", entry.getValue());
            newList.add(hashMap);
        }
        return newList;
    }

java 参数传递、对象、封装

参数传递分为值传递(传值)和引用传递(传地址)。

面向对象的三大特征

1. 封装

2. 继承

3. 多态

封装表现

1、方法就是一个最基本封装体。

2、类其实也是一个封装体。

封装的好处

1、提高了代码的复用性。

2、隐藏了实现细节,还要对外提供可以访问的方式。便于调用者的使用。这是核心之一,也可以理解为就是封装的概念。

3、提高了安全性。

构建set、get方法

在类中右键,选择source,选择setter与getter方法

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯