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

目录
  • java两个对象之间传值及封装
  • java 参数传递、对象、封装
    • 面向对象的三大特征
    • 封装表现
    • 封装的好处
    • 构建set、get方法

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

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

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

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


import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
 * @Description:
 * 通过两个对象的传入,进行两个对象的赋值,
 * 共2个参数,把第一个对象中的参数传递给第二个对象
 * @author: 长河
 * @version:    0.0.2beta
 * @Company:
 * @date:       2017年3月26日
 */
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 的方法,还有一个简单的方法

/**
     * 对象转换成Map,以属性名为key, 值为value.全部的转成Map,null也弄进去了
     *
     * @param object
     * @return
     */
    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;
    }
/**
     * 读取properties 配置文件中的所有内容,全部读取,变成map,以key-value保存
     *
     * @param object
     * @throws IllegalAccessException
     */
    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}, ]这种不好解析,不是很方便。

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

/**
     * 把Map变成List中的Map,组成key-value 的形式
     *
     * @param map
     * @return
     */
    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方法

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

(0)

相关推荐

  • SpringMVC的简单传值(实现代码)

    之前学习SpringMVC时感觉他的传值很神奇:简便,快捷,高效. 今天写几个简单的传值与大家分享,希望能对大家有帮助. 一. 从后往前传: (1) @Controller @RequestMapping(value={"/hello"}) public class HelloController { @RequestMapping(value={"sub"}) public ModelAndView submit(HttpServletRequest reques

  • Java 多线程传值的四种方法

    其实大家都知道多线程传值有三种方式: 1:通过构造方法传递数据 2:通过变量和方法传递数据 3:通过回调函数传递数据 那么博主有个非常变态的需求,所以找出了第四种实现方式,先看效果图: 动态Cron4j调度器,我曾经发过类似的文章,可以去搜索一下. 点击执行走下边的代码,然后根据类名反编译 public static void executeCron4j(String packageClass){ try { Object taskObj = classNewInstance(packageCl

  • springmvc前台向后台传值几种方式总结(从简单到复杂)

    1. 基本数据类型(以int为例,其他类似): Controller代码: @RequestMapping("saysth.do") public void test(int count) { } 表单代码: <form action="saysth.do" method="post"> <input name="count" value="10" type="text"

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

    目录 java两个对象之间传值及封装 java 参数传递.对象.封装 面向对象的三大特征 封装表现 封装的好处 构建set.get方法 java两个对象之间传值及封装 在项目里面使用SSH框架的过程中, 经常涉及到修改,我们只要对部门的部门属性进行修改我们通常的做法是先从数据库把对象查询出来target 再把从页面上传递来的修改过的值封装成为一个对象model,我们需要把model中修改过的属性重新赋值给target,再对target进行保存.完成修改 在这个target.setXxx(mode

  • Android开发两个activity之间传值示例详解

    目录 使用Inten的putExtra传递 使用Intention的Bundle传递 使用Activity销毁时传递数据 SharedPreferences传递数据 使用序列化对象Seriazable 使用静态变量传递数据 handler 使用Inten的putExtra传递 第一个Activity中 //创建意图对象 Intent intent = new Intent(this,MainActivity2.class); //设置传递键值对 intent.putExtra("name&quo

  • Javascript showModalDialog两个窗体之间传值

    Javascript 两个窗体之间传值实现代码javascript中还有一个函数window.showModalDialog也可以打开一个新窗体,不过他打开的是一个模态窗口,那么如何在父窗体和子窗体之间传值呢?我们先看该函数的定义:vReturnValue = window.showModalDialog(sURL [, vArguments] [,sFeatures]) 参数说明: sURL--必选参数,类型:字符串.用来指定对话框要显示的文档的URL. vArguments--可选参数,类型

  • java 判断两个对象是否为同一个对象实例代码

    java 判断两个对象是否为同一个对象 用"=="比较的是引用的地址,用equals比较的就是值.那我们new两个相同的对象什么属性都一样,为什么编译的时候不相同,这是因为我们调用的是父类也就是Object的equals方法,这里我们就需要重写这个equals方法. public class Test5 { public static void main(String[] args) { User mUser1 = new User("zhangsan", &quo

  • 基于java中两个对象属性的比较

    两个对象进行比较相等,有两种做法: 1.情况一:当仅仅只是判断两个对象是否相等时,只需重写equals()方法即可.这里就不用说明 2.情况二:当除了情况一之外,还需知道是那个属性不同,那么就需要采用类反射, 具体代码如下: public static void main(String[] args) { A a = new A(); a.setUserName("a"); a.setPassword("p"); a.setQq("q"); a.

  • Java中两个大数之间的相关运算及BigInteger代码示例

    Java中两个大数之间的相关运算及BigInteger两段实例代码,具体如下. 大数相减 import java.util.Scanner; /* 进行大数相减,只能对两个正数进行相减 */ public class BigNumber { public static void main(String[] args) { Scanner scan=new Scanner(System.in); String a,b; while (scan.hasNext()) { BigNumber big=

  • Java比较两个对象中全部属性值是否相等的方法

    例如下述Java类: import java.io.Serializable; import java.util.List; public class Bean_Topology implements Serializable { private static final long serialVersionUID = 1L; public static long getSerialversionuid() { return serialVersionUID; } private Long to

  • python开发中两个list之间传值示例

    由于改代码因为这个问题卡了半个小时特此记录 首先对于一个单层的列表 赋值如下,可以看见,如果直接使用 = 的话.其中一个变换便会引起另外一个变换,这时因为这两个list被python解释的时候使用的相同的地址,如下面输出的 id()中的内容,所以此时如果想让一个列表接收到另外一个列表的值,并且在接收到值后不会因为其中任意一个值的改变而改变,这时候就需要使用copy方法,这里可以解释成,当使用了copy方法后,python单独创建了找个一个内存区的地址放了新的那个值. a = [ 1,2,3] b

  • Java比较两个对象大小的三种方法详解

    目录 一. 为什么需要比较对象 二. 元素的比较 1. 基本类型的比较 2. 引用类型的比较 三. 对象比较的方法 1. equals方法比较 2. 基于Comparable接口的比较 3. 基于Comparator接口的比较 4. 三种比较方式对比 一. 为什么需要比较对象 上一节介绍了优先级队列,在优先级队列中插入的元素必须能比较大小,如果不能比较大小,如插入两个学生类型的元素,会报ClassCastException异常 示例: class Student{ String name; in

  • Extjs4中tree的拖拽功能(可以两棵树之间拖拽) 简单实例

    复制代码 代码如下: //只要要在treepanel中配置一下viewConfig即可,如果是两棵树之间,两棵树都要配置    viewConfig:{   plugins :{    ptype:'treeviewdragdrop',    appendOnly:true   //只能拖着带非叶节点上   },   listeners:{//监听器    drop:function(node,data,overModel,dropPosition,options){     //ajax的操作

随机推荐