1.1 JavaBean的概述和规范
- JavaBean的概述:
- 将需要操作的多个属性封装成JavaBean 简单来说就是用于封装数据的
- 规范:
- 类使用公共进行修饰
- 提供私有修饰的成员变量
- 为成员变量提供公共getter和setter方法
- 提供公共无参的构造
1.1.1 实例代码
package com.itheima_02;
import java.io.Serializable;
/*
* JavaBean:用于封装数据
* 类使用公共进行修饰
* 提供私有修饰的成员变量
* 为成员变量提供公共getter和setter方法
* 提供公共无参的构造
* 实现序列号接口
*
*/
public class Person implements Serializable {
private static final long serialVersionUID = 1049712678750452511L;
private String name;
private int age;
private String gender;
public Person() {
super();
// TODO Auto-generated constructor stub
}
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;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", gender=" + gender + "]";
}
}
1.2 BeanUtils的概述
- BeanUtils的由来
- 之前我们使用的类都是来自Java编写好的源代码
而这个BeanUtils却是一个叫做Apache的组织编写.
那么这个组织编写的代码当中, 有一个系列可以很方便的提高我们今后的开发效率.
这个系列为Commons, BeanUtils就是其中之一
- 之前我们使用的类都是来自Java编写好的源代码
1.2.1 准备工作
- 导入两个jar包
- commons-beanutils-1.8.3.jar
- commons-logging-1.1.1.jar
- 将jar包Build path 配置到当前的classpath环境变量中
1.3 BeanUtils的常用方法
static void setProperty(Object bean, String name, Object value)
static String getProperty(Object bean, String name)
static void populate(Object bean, Map properties)
setProperty 用来给对象中的属性赋值(了解)
参数1: 需要设置属性的对象
参数2: 需要修改的属性名称
参数3: 需要修改的具体元素
getProperty 用来获取对象中的属性(了解)
参数1: 要获取的javaBean对象
参数2: 对象中的哪个属性
Populate 用来给对象中的属性赋值(掌握)
参数1: 要设置属性的对象
参数2: 将属性以Map集合的形式传入
Key : 属性的名称
Value: 属性具体的值
1.3.1 实例代码
package com.itheima_02;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.beanutils.BeanUtils;
/*
* BeanUtils:Apache commons提供的一个组件,主要功能就是为了简化JavaBean封装数据的操作
* static void setProperty(Object bean, String name, Object value)
* static String getProperty(Object bean, String name)
* static void populate(Object bean, Map properties)
*
* 注意:BeanUtils的setProperty和getProperty方法底层并不是直接操作成员变量,而是操作和成员变量名有关的get和set方法
*/
public class BeanUtilsDemo {
public static void main(String[] args) throws ReflectiveOperationException {
//static void populate(Object bean, Map properties)
Person p = new Person();
Map<String,Object> map = new HashMap<String,Object>();
map.put("name", "lisi");
map.put("age", 18);
map.put("gender", "male");
BeanUtils.populate(p,map);
System.out.println(p);
}
private static void method() throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
Person p = new Person();
//System.out.println(p);
//static void setProperty(Object bean, String name, Object value) :给JavaBean对象的成员变量进行赋值
BeanUtils.setProperty(p, "name", "zhangsan");
//BeanUtils.setProperty(p, "age", 18);
//System.out.println(p);
//static String getProperty(Object bean, String name)
String name = BeanUtils.getProperty(p, "name");
System.out.println(name);
}
}
1.3.2 方法总结
三个方法底层是通过反射实现, 而且反射操作的是setXxx方法和getXxx方法.
所以编写JavaBean的时候一定要注意格式
1.4自定义BeanUtils的赋值和获取方法实现.
1.4.1 功能分析
定义MyBeanUtils工具类, 实现与BeanUtils相同的功能
public static void setProperty(Object bean,String name,Object value)
// 设置任意对象的, 任意属性, 为任意的值
public static String getProperty(Object bean,String name)
// 获取任意对象的任意属性
public static void populate(Object bean,Map map)
// 修改任意对象中的属性, 为传入Map集合中的键和值
1.4.2 实例代码
package com.itheima_03;
import java.lang.reflect.Field;
public class MyBeanUtils {
private MyBeanUtils() {}
//public static void setProperty(Object bean,String name,Object value)
public static void setProperty(Object bean,String name,Object value) throws ReflectiveOperationException {
//根据JavaBean对象获取对应的字节码对象
Class clazz = bean.getClass();
//根据字节码对象获取对应的Field对象
Field f = clazz.getDeclaredField(name);
//设置权限,让虚拟机不进行访问的检查
f.setAccessible(true);
//赋值
f.set(bean, value);
}
//public static String getProperty(Object bean,String name)
public static String getProperty(Object bean,String name) throws ReflectiveOperationException {
Class clazz = bean.getClass();
Field f = clazz.getDeclaredField(name);
f.setAccessible(true);
Object obj = f.get(bean);
return obj.toString();
}
}
1.5 自定义BeanUtils的populate方法实现
1.5.1 功能分析
public static void populate(Object bean,Map map)
// 修改任意对象中的属性, 为传入Map集合中的键和值
思路:
1.获取传入对象的字节码对象
2.获取map集合中所有的键和值
3.调用Class中的getDeclaredField()方法将每一个键传入, 得到Field对象
4.通过Field对象中的set方法赋值
5.Try catch捕获getDeclaredField方法可能发生的异常.(为了方式传入错误的值)
1.5.2 实例代码
//public static void populate(Object bean,Map map)
public static void populate(Object bean,Map map) throws ReflectiveOperationException {
//通过JavaBean对象来获取对应的字节码对象
Class clazz = bean.getClass();
//获取Map中所有的key
Set keys = map.keySet();
for (Object key : keys) {
try {
//根据key来获取对应的Field对象
Field f = clazz.getDeclaredField(key.toString());
//根据key来获取Map中对应的value
Object value = map.get(key);
f.setAccessible(true);
f.set(bean, value);
} catch(NoSuchFieldException e) {
//e.printStackTrace();
}
}
}
网友评论