随笔都是学习笔记
随笔仅供参考,为避免笔记中可能出现的错误误导他人,请勿转载。

简介:

Introspector 类为工具提供了一种了解目标 Java Bean 支持的属性、事件和方法的标准方法。
Introspector 就是一种类的自省,能够通过反射获取标准Java Bean类的信息。

首先需要得到BeanInfo接口对象:

public static BeanInfo getBeanInfo​(Class<?> beanClass) throws IntrospectionException

一般是为了使用下面两个方法:

第一个获取指定JavaBean的方法信息,第二个是获取JavaBean的属性信息。

在PropertyDescriptor类中有两个方法:

public class PropertyDescriptor
extends FeatureDescriptor
可以读Javabean的方法:public Method getReadMethod()

可以写Javabean的方法:public Method getWriteMethod()

可以通过上面两个方法来操作Javabean的属性

这里进行代码实验需要两个包:

 

 

这两个包是依赖Introspector接口才能使用

BeanUtils中有两个方法可以获取、设置Javabean的属性信息:

public static void setProperty(Object bean, String name, Object value)
throws IllegalAccessException, InvocationTargetException {
        BeanUtilsBean.getInstance().setProperty(bean, name, value);
    }
public static String getProperty(Object bean, String name)
throws IllegalAccessException, InvocationTargetException,NoSuchMethodException {
        return BeanUtilsBean.getInstance().getProperty(bean, name);
    }

测试代码:

Person类

package bean;
import java.util.Objects;
/**
 * JavaBean中必须要有setter/getter方法(只要一个也行)
 * 必须要有无参的构造函数
 * 一般将拥有get/set的成员变量称为属性
 * 
 * 其实就算一个属性没有对应的成员变量,只有get/set方法也是可以的
 * 属性的名称其实是get/set方法去掉get/set然后首字母小写得到的那个名称:
 *                     getName()对应的属性应该是name,不管方法中的成员变量是username还是sname,属性名称都只和方法名称有关 
 * 如果一个属性只有get方法,那么这个属性为只读,不可修改
 */
public class Person {
    private String name;
    private int age;
    private String sex;
    
    public Person() {
    }

    public Person(String name, int age, String sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }
    
    public String getId() {    // 没有成员变量的属性
        return "S001";
    }

    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 getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + ", sex=" + sex + "]";
    }

    @Override
    public int hashCode() {
        return Objects.hash(age, name, sex);
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Person other = (Person) obj;
        return age == other.age && Objects.equals(name, other.name) && Objects.equals(sex, other.sex);
    }

}

User类

package bean;
import java.util.Objects;
public class User {
    private String username;
    private String password;

    public User() {
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    
    @Override
    public int hashCode() {
        return Objects.hash(password, username);
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        User other = (User) obj;
        return Objects.equals(password, other.password) && Objects.equals(username, other.username);
    }

    @Override
    public String toString() {
        return "User [username=" + username + ", password=" + password + "]";
    }
    
}

工具类:

package utils;
import java.util.Map;
import java.util.UUID;
import org.apache.commons.beanutils.BeanUtils;
public class commonsUtils {
    /**
     * 返回不重复的32位长的大写字符串
     * 
     * @return
     */
    public static String uuid() {
        return UUID.randomUUID().toString().replace("-", "").toUpperCase();
    }

    public static <T> T toBean(Map map, Class<T> clazz) {
        try {
            //创建指定的Javabean对象
            T bean = clazz.getDeclaredConstructor().newInstance();
            // 把数据封装到Javabean中
            BeanUtils.populate(bean, map);
            // 返回Javabean对象
            return bean;            
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

测试类:

package bean;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.beanutils.BeanUtils;
import org.junit.jupiter.api.Test;
import utils.commonsUtils;
public class Demo {
    @Test
    public void fun1() throws Exception {
        // 通过反射得到类的class对象
        String className = "bean.Person";
        Class<?> clazz = Class.forName(className);
        // 调用无参构造函数
        Object bean = clazz.getDeclaredConstructor().newInstance();

        BeanUtils.setProperty(bean, "name", "张三"); // 通过BeanUtils的方法为Bean中的属性设置信息
        BeanUtils.setProperty(bean, "sex", "男"); // 通过BeanUtils的方法为Bean中的属性设置信息
        BeanUtils.setProperty(bean, "age", "15"); // 通过BeanUtils的方法为Bean中的属性设置信息
        // 如果有属性没有设置值,那么该属性为初始默认值
        // 设置不存在的属性信息,自动忽略
        BeanUtils.setProperty(bean, "sss", "男"); // 通过BeanUtils的方法为Bean中的属性设置信息

        // 获取age属性信息并从String转换为int
        int age = Integer.parseInt(BeanUtils.getProperty(bean, "age"));
        System.out.println(bean);
        System.out.println(age);
    }

    @Test
    public void fun2() throws IllegalAccessException, InvocationTargetException {
        /**
         * 将map集合中的属性直接封装到Bean中:map中的键必须和Bean中的属性名相同
         * Map:"username":"zhangsan","password":"123"
         */
        // 创建map集合
        Map<String, String> map = new HashMap<String, String>();
        map.put("username", "zhangsan");
        map.put("password", "123");

        // 获取User实例化对象
        User user = new User();
        // 将map中的键对应的值赋值给User中的属性
        BeanUtils.populate(user, map);
        System.out.println(user.toString());
    }

    @Test
    public void fun3() {
        // 创建map集合
        Map<String, String> map = new HashMap<String, String>();
        map.put("username", "zhangsan");
        map.put("password", "123");
        
        User bean = commonsUtils.toBean(map, User.class);
        System.out.println(bean.toString());
    }
}

结果:

 

 提示:通过上诉操作,可以映射到对表单提交数据的处理,因为ServletRequest对象有个方法:

java.util.Map<java.lang.String,java.lang.String[]> getParameterMap()

通过request.getParameteMap()方法可以得到一个Map集合数据集,然后通过上面的操作进行封装到Javabean中。

 

posted on 2022-04-25 12:48  时间完全不够用啊  阅读(102)  评论(0编辑  收藏  举报