黑马程序员技术交流社区

标题: 【石家庄校区】BeanUtils介绍及使用 [打印本页]

作者: 水煮牛蛙    时间: 2018-4-23 16:00
标题: 【石家庄校区】BeanUtils介绍及使用
本帖最后由 小石姐姐 于 2018-4-25 15:51 编辑

BeanUtils介绍及使用

BeanUtils : 来自于Apache(阿帕奇)这个开源组织,有很优秀的开源项目,类库,工具类,框架
                之前我们使用的类都是来自Java编写好的源代码
                而这个BeanUtils却是一个叫做Apache的组织编写.
                那么这个组织编写的代码当中, 有一个系列可以很方便的提高我们今后的开发效率.
                这个系列为Commons, BeanUtils就是其中之一
        主要功能:
                就是为了简化JavaBean封装数据的操作
               
*
* BeanUtils的使用配置:  
*                 一. 将commons-beanutils-1.8.3-bin.zip 压缩包解压:
                1.导入两个jar包,放到工程目录下
                        commons-beanutils-1.8.3.jar(核心jar包)
                        commons-logging-1.1.1.jar (日志,是BeanUtils依赖的另一个jar包,commons里的很多工具包
                                就依赖于这个包)
                2.配置Build Path(构建环境)
                        选中两个文件-->右击--->Build Path--->add to Build Path
                        之后会获得一个类库:
               
                将jar包Build path 配置到当前的classpath环境变量中
               
        三个常用方法:
                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,populate方法底层并不是直接操作成员变量,而是操作和成员变量名有关的get和set方法.
        //上边的set和get方法,当类里边没有定义get和set方法时,是不能使用的,setProperty(不会报错,也不赋值)
         getProperty(会报错)
               
               
        
        setProperty  用来给对象中的属性赋值(了解)
                参数1: 需要设置属性的对象
                参数2: 需要修改的属性名称
                参数3: 需要修改的具体元素        
        
        getProperty 用来获取对象中的属性(了解)
                参数1: 要获取的javaBean对象
                参数2: 对象中的哪个属性
               
        Populate 用来给对象中的属性赋值(掌握)

                参数1: 要设置属性的对象
                参数2: 将属性以Map集合的形式传入
                                        Key : 属性的名称
                                        Value:  属性具体的值
*/
public class BeanUtils的概述 {

        public static void main(String[] args) throws ReflectiveOperationException {
                Person p = new Person();
                System.out.println(p);
                /*Output:
                        Person [name=null, age=0, gender=null]
                *///:Person类创建成功
               
                //static void setProperty(Object bean,string name ,Object value);
                //给JavaBean的成员变量赋值
                BeanUtils.setProperty(p, "name", "香蕉");
                System.out.println(p);
                /*Output:
                        Person [name=香蕉, age=0, gender=null]
                *///:name 变量设置成功
               
                //static String getProperty(Object bean,String name);
                //获取JavaBean的成员变量值
                String name = BeanUtils.getProperty(p, "name");
                System.out.println(name);
                /*Output:
                        香蕉
                *///:获取的返回值都是String类型的,如果像转换成int型,使用Integer.parseInt(name)方法
               
                Map<String,Object> map = new HashMap<String,Object>();
                map.put("name", "橘子");
                map.put("age", 22);
                map.put("gender","male");
                map.put("birthday", "2018.4.20");
               
                BeanUtils.populate(p, map);
                System.out.println(p);
                /*Output:
                        Person [name=橘子, age=22, gender=male]
                *///:虽然Person类中没有birthday,但是也没有报错,只是没有使用这个值
               
        }

}
------------------------------------------
package com.jobday13;

import java.lang.reflect.Field;
import java.util.Map;
import java.util.Set;

/*
* 自定义Beanutils类:
*
*                 static void setProperty(Object bean, String name, Object value)
                static String getProperty(Object bean, String name)
                static void populate(Object bean, Map properties)
*
*
*/
public class 自定义BeanUtils {

        // static void setProperty(Object bean, String name, Object value)
        public static void setProperty(Object bean, String name, Object value) throws ReflectiveOperationException{
                //获取字节码对象
                Class clazz = bean.getClass();
                //获取对应的字段
                Field f = clazz.getDeclaredField("name");
                //将对象的指定字段设置为指定值
                f.setAccessible(true);
                f.set(bean, value);
               
        }
        
                //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");
                        //取消Java的默认访问检查
                        f.setAccessible(true);
                        //获取指定自段值
                        Object value = f.get(bean);
                        
                        return value.toString();
                        
                }
               
                //static void populate(Object bean, Map properties)
                static void populate(Object bean, Map map) throws ReflectiveOperationException{
                        //获取字节码对象
                        Class clazz = bean.getClass();
                        //获取所有的字段
                        //获取Map中所有的key
                        Set keys = map.keySet();
                        //遍历keys ,通过key获取指定的字段
                        for(Object key : keys){
                                
                                try {
                                        Field f = clazz.getDeclaredField(key.toString());
                                        //通过key 获取 值
                                        Object value = map.get(key);
                                        //取消Java的默认访问检查
                                        f.setAccessible(true);
                                        f.set(bean, value);
                                } catch (NoSuchFieldException e) {
                                        //此处不进行操作
                                }
                        }
                }
}
-----------------
package com.jobday13;

import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.beanutils.BeanUtils;


public class 测试类_自定义Beanutils类 {

        public static void main(String[] args) throws ReflectiveOperationException{
                Person p = new Person();
               
                自定义BeanUtils.setProperty(p, "name", "haha");
                System.out.println(p);
               
                Map<String,Object> map = new HashMap<String,Object>();
                map.put("name", "橘子");
                map.put("age", 22);
                map.put("gender","male");
                map.put("birthday", "2018.4.20");
               
                自定义BeanUtils.populate(p, map);
               
                System.out.println(p);
                /*Output:
                        Person [name=橘子, age=22, gender=male]
                *///:~
        }
}







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2