简介:
1 | 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中。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)