一、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());
}
}