JavaBean

一、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)