美文网首页
Java 基础 51 JavaBean的概述及其BeanUti

Java 基础 51 JavaBean的概述及其BeanUti

作者: 小熊先生很不开心 | 来源:发表于2018-03-09 08:45 被阅读31次

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就是其中之一

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

相关文章

网友评论

      本文标题:Java 基础 51 JavaBean的概述及其BeanUti

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