JavaBean

作者: 嗷老板 | 来源:发表于2018-03-12 21:59 被阅读0次

    一、JavaBean的概述

      JavaBean的主要作用是封装数据,是一种创建类的标准,包括:

    • 类使用公共进行修饰
    • 提供私有修饰的成员变量,为成员变量提供公共的getter和setter方法
    • 提供公共无参的构造方法——这个需要注意
    • 实现序列化接口
        序列化是指把数据按照某种规律写到文档中;
        反序列化是指把写入的字节数据翻译出来,翻译成对应的对象再使用。

    那么我们为什么要使用JavaBean来封装数据呢?
      首先,这是一个编程思想,也就是所谓“面向对象”的问题,JavaBean本身是一个Java对象,他对数据进行的封装,我们需要访问数据的时候只要访问这个对象就可以了,因为数据就存储在这个对象中;
      其次,如果你的方法参数比较少还好,如果多一些,比如10个,你就需要定义一个具有10个参数的方法;但是如果使用JavaBean做参数,可以直接调用,传入一个对象即可,数据都存在对象里面,想用的话直接从里面拿,非常方便。

    import java.io.Serializable;
    
    public class Student implements Serializable {
        // 实现序列号接口
        private static final long serialVersionUID = 799887342985222720L;
    
        // 提供私有修饰的成员变量
        private String name;
        private int age;
        private String gender;
    
        // 提供公共无参的构造
        public Student() {
        }
    
        // 为成员变量提供公共getter和setter方法
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public String getGender() {
            return gender;
        }
    
        public void setGender(String gender) {
            this.gender = gender;
        }
    
        // 这里为了方便调用学生类对象内容重写toString方法
        @Override
        public String toString() {
            return "Student [name=" + name + ", age=" + age + ", gender=" + gender + "]";
        }
    
    }
    

    二、BeanUtils的概述

      BeanUtils是Apache commons提供的一个组件,主要功能是为了简化JavaBean封装数据的操作。由于他不是JDK提供的,所以使用的时候需要导入jar包。
      这里为读者提供BeanUtils的jar包的下载链接: https://pan.baidu.com/s/1DaUeHtiveyDqZwQDCDfPcw 密码: 9etp

    使用步骤:
      1、在项目中创建一个lib目录;
      2、拷贝commons-beanutils-1.8.3.jar包和commons-logging-1.1.1.jar包到lib目录下;
      3、添加到环境中:选择jar包--右键--Build Path--Add to Build Path。

    三、BeanUtils的常用方法

        //为给定对象的某个属性赋值
        static void setProperty(Object bean, String name, Object value)
        //获取给定对象的某个属性的值
        static String getProperty(Object bean, String name)  
        //批量为对象的属性赋值----常用!!!
        static void populate(Object bean, Map properties) 
    

    示例:

    import java.util.HashMap;
    import java.util.Map;
    
    import org.apache.commons.beanutils.BeanUtils;
    
    public class BeanUtilsDemo {
        public static void main(String[] args) throws ReflectiveOperationException {
            //首先创建Student类的的对象
            Student s1 = new Student();
            
            //调用BeanUtils类中的方法,为对象赋值
            BeanUtils.setProperty(s1, "name", "张三");
            BeanUtils.setProperty(s1, "age", 20);
            BeanUtils.setProperty(s1, "gender", "男");
            System.out.println(s1.toString());
            System.out.println("-------------------------");
            
            //调用BeanUtils类中的方法,得到对象的值
            String name = BeanUtils.getProperty(s1, "name");
            String age = BeanUtils.getProperty(s1, "age");
            String gender = BeanUtils.getProperty(s1, "gender");
            System.out.println(name+"---"+age+"---"+gender);
            System.out.println("--------------------------");
            
            //调用BeanUtils类中的方法,为对象赋值
            Map map = new HashMap<>();
            map.put("name", "李思思");
            map.put("age", 25);
            map.put("gender", "女");
            Student s2 = new Student();
            BeanUtils.populate(s2, map);
            System.out.println(s2.toString());
            
        }
    
    }
    

    注意:
      1、BeanUtils的setProperty方法和getProperty方法底层并不是直接操作成员变量,而是操作和成员变量名有关的get和set方法;
      2、setProperty和之前set方法的区别
      set只能为某个成员变量赋值,setProperty不属于某个对象,直接用类名进行调用,可以为任意一个成员变量赋值;
      3、populate方法中key对应成员变量的名字,value对应成员变量所对应具体的值。

    四、自定义BeanUtils的赋值和获取方法实现

      BeanUtils类的三个方法底层使用的反射机制,所以我们自定义BeanUtils应该调用反射机制来实现。
      为了简化我们的方法,我们不再调用get和set方法,直接对属性进行更改。

    示例:

    //自定义BeanUtils类
    import java.lang.reflect.Field;
    import java.util.Map;
    import java.util.Set;
    
    public class MyBeanUtils {
        // 工具类私有构造方法
        private MyBeanUtils() {
        };
    
        public static void setProperty(Object bean, String name, Object value) throws ReflectiveOperationException {
            // 获取学生类的字节码对象
            Class clazz = bean.getClass();
            // 获取属性的对象
            Field f = clazz.getDeclaredField(name);
            // 设置反射时取消Java的访问检查(去除私有权限)
            f.setAccessible(true);
            // 设置属性
            f.set(bean, value);
        }
    
        public static String getProperty(Object bean, String name) throws ReflectiveOperationException {
            Class clazz = bean.getClass();
            Field f = clazz.getField(name);
            f.setAccessible(true);
            // 获取属性的值,并将它转化为String类型
            String value = f.get(bean).toString();
            return value;
        }
    
        public static void Population(Object bean, Map map) throws ReflectiveOperationException {
            Class clazz = bean.getClass();
            // 遍历集合
            Set entrySet = map.entrySet();
            // 如果有的key没有对应的成员变量就会报NoSuchFieldException异常错误,程序就不能正常运行
            // 所以我们需要用try...catch来处理它
            try {
                for (Object key : entrySet) {
                    // 获取属性的对象
                    Field f = clazz.getField(key.toString());
                    // 设置反射时取消Java的访问检查(去除私有权限)
                    f.setAccessible(true);
                    Object value = map.get(key);
                    f.set(key, value);
                }
            } catch (NoSuchFieldException e) {
                // 如果有的key没有对应的成员变量,我们直接跳过它即可,不用打印异常信息
                // e.printStackTrace();
            }
        }
    
    }
    
    //测试类
    import java.util.HashMap;
    import java.util.Map;
    
    public class Test {
        public static void main(String[] args) throws ReflectiveOperationException {
            // 首先创建Student类的的对象
            Student s1 = new Student();
    
            // 调用MyBeanUtils类中的方法,为对象赋值
            MyBeanUtils.setProperty(s1, "name", "张三");
            MyBeanUtils.setProperty(s1, "age", 20);
            MyBeanUtils.setProperty(s1, "gender", "男");
            System.out.println(s1.toString());
            System.out.println("-------------------------");
    
            // 调用MyBeanUtils类中的方法,得到对象的值
            String name = MyBeanUtils.getProperty(s1, "name");
            String age = MyBeanUtils.getProperty(s1, "age");
            String gender = MyBeanUtils.getProperty(s1, "gender");
            System.out.println(name + "---" + age + "---" + gender);
            System.out.println("--------------------------");
    
            // 调用MyBeanUtils类中的方法,为对象赋值
            Map map = new HashMap<>();
            map.put("name", "李思思");
            map.put("age", 25);
            map.put("gender", "女");
            Student s2 = new Student();
            MyBeanUtils.populate(s2, map);
            System.out.println(s2.toString());
    
        }
    
    }
    

    相关文章

      网友评论

          本文标题:JavaBean

          本文链接:https://www.haomeiwen.com/subject/pmggfftx.html