//用户对象类
publicclass 用户实现可序列化{
私有静态最终长serialVersionUID=1L;
私有int id;
私有字符串用户名;
私有字符串密码;
私人String[] 爱好;
公共用户(){}
公共字符串[] getHobbies(){
回归爱好;
}
公共无效setHobbies(字符串[]爱好){
this.hobbies=爱好;
}
公共int getId() {
返回ID;
}
公共无效setId(int id){
这个.id=id;
}
公共字符串getUsername() {
返回用户名;
}
公共无效setUsername(字符串用户名){
this.用户名=用户名;
}
公共字符串getPassword() {
返回密码;
}
公共无效setPassword(字符串密码){
this.password=密码;
}
@覆盖
公共字符串toString() {
return "用户[id="+id+",用户名="+用户名+",密码="+密码+",爱好="
+ Arrays.toString(爱好) +"]"; //这里使用了数组工具类Arrays的方法toString(array)
}
}
方法1 :setProperty(对象
obj, String name, Object value) 括号中参数obj: JavaBean的对象; name: JavaBean中的成员变量名; value: 成员变量的值;代码如下:
@测试
publicvoid demo01()抛出异常{
用户用户=新用户();
BeanUtils.setProperty(用户, "id",3);
BeanUtils.setProperty(user,"用户名","汤姆");
BeanUtils.setProperty(用户,"密码","杰瑞");
System.out.println(用户);
}
方法二:getProperty(Object
obj, String name) 返回值为String,括号内参数obj: JavaBean的对象; name: JavaBean中的成员变量的名称
@测试
publicvoid demo02()抛出异常{
用户用户=新用户();
用户.setId(5);
user.setUsername("jack");
user.setPassword("玫瑰");
String id=BeanUtils.getProperty(user,"id");
String 用户名=BeanUtils.getProperty(user, "用户名");
字符串密码=BeanUtils.getProperty(用户,"密码");
System.out.println(id+""+用户名+""+密码);
}
方法三:populate(Object
bean,Map属性)括号中的参数bean:
JavaBean对象;properties: Map键值对集合
@测试
publicvoid demo03()抛出异常{
用户用户=新用户();
//创建一个Map集合,键为变量名,值为String数组
映射属性=new HashMap();
property.put("id", newString[]{"5"});
property.put("用户名", newString[]{"jack"});
property.put("password", newString[]{"rose"});
property.put("爱好", newString[]{"篮球","跑步","跳绳"});
BeanUtils.populate(用户,属性);
System.out.println(用户);
}
接下来我们要做的就是自定义BeanUtils工具类,并将其封装在一个方法中。
版本1 :
公共类实用程序{
公共静态无效主(字符串[] args){
用户用户=新用户();
映射属性=new HashMap();
property.put("id", newString[]{"007"});
property.put("用户名",new String[]{"jack"});
property.put("密码",new String[]{"rose"});
properties.put("爱好", newString[]{"吃","吃鱼","手机游戏"});
填充(用户,属性);
System.out.println(用户);
}
/*
*静态方法、传递对象和Map集合
*Map集合中的键值对存储在JavaBean对象中
*/
公共静态无效填充(Objectobj,地图属性){
尝试{
BeanUtils.populate(obj, 属性);
}catch(异常前){
例如:printStackTrace();
}
}
}
版本2 : 调用者不需要创建对象,在方法中创建对象(反射技术),然后返回
公共类Utils_2 {
公共静态无效主(字符串[] args){
映射属性=new HashMap();
property.put("id", newString[]{"1"});
property.put("用户名",new String[]{"jack"});
property.put("密码",new String[]{"rose"});
properties.put("爱好", newString[]{"吃","吃鱼","手机游戏"});
用户obj=(User)populate(User.class,properties);
System.out.println(obj);
}
/*
*静态方法,Map集合
*Map集合中的键值对存储在JavaBean对象中
*/
公共静态对象填充(类clazz,映射属性){
尝试{
//反射模式,创建对象
对象obj=clazz.newInstance();
BeanUtils.populate(obj, 属性);
返回对象;
}catch(异常前){
//一旦数据操作失败,停止运行并修改代码
throw new RuntimeException("数据注入失败");
}
}
}
版本3 : 调用者不需要创建对象。方法中创建对象(反射技术),然后返回;添加通用技术以避免调用者的类型被强制。调用者返回什么类型的对象?
公共类Utils_3{
公共静态无效主(字符串[] args){
映射属性=new HashMap();
property.put("id", newString[]{"1"});
property.put("用户名",new String[]{"jack"});
property.put("密码",new String[]{"rose"});
properties.put("爱好", newString[]{"吃","吃鱼","手机游戏"});
用户u=populate(User.class,properties);
System.out.println(u);
}
/*
*静态方法,Map集合
*Map集合中的键值对存储在JavaBean对象中
*/
publicstatic T populate(类clazz, 地图属性){
尝试{
T t=clazz.newInstance();
BeanUtils.populate(t, 属性);
返回t;
} catch (异常e) {
throw new RuntimeException("数据注入失败");
}
}
}
下面用一个案例结合反射和xml来增强上面的内容:
需求:读取XML中的配置文件信息,使用BeanUtils工具类创建JavaBean对象,并将XML中的数据保存到JavaBean类的属性中。
packagecom.demo.bean;
公共类用户{
私有字符串用户名;
私有字符串密码;
公共字符串getUsername() {
返回用户名;
}
公共无效setUsername(字符串用户名){
this.用户名=用户名;
}
公共字符串getPassword() {
返回密码;
}
公共无效setPassword(字符串密码){
this.password=密码;
}
@覆盖
公共字符串toString() {
return "用户[用户名="+用户名+",密码="+密码+"]";
}
}
packagecom.demo.bean;
公开课学生{
私有字符串名称;
私有整数年龄;
公共字符串getName() {
返回名称;
}
公共无效setName(字符串名称){
this.name=名称;
}
公共int getAge() {
返回年龄;
}
公共无效setAge(int年龄){
this.age=年龄;
}
@覆盖
公共字符串toString() {
return "学生[姓名="+姓名+",年龄="+年龄+"]";
}
}
公共类TestJavaBean {
@测试
公共无效演示()抛出异常{
//SaxReader核心类对象
SAXReader sax=new SAXReader();
//读取xml文档并生成Document对象
Document document=sax.read("data.xml");//文件位置在项目根目录
//文档对象的方法,获取标签元素getRootElement()
元素rootElement=document.getRootElement();
//rootElement对象方法elements()获取子标签bean
列表beanListElement=rootElement.elements();
for(元素beanElement :beanListElement){
//beanElement标签对象的方法attribValue()获取bean标签的属性className的值
String className=beanElement.attributeValue("className");
//className是配置的JavaBean类的类名,通过反射创建对象。
类clazz=Class.forName(className);
对象obj=clazz.newInstance();
//beanElement bean label对象方法elements()获取子标签属性
列表proListElement=beanElement.elements();
for(元素proElement :proListElement){
//proElement子标签属性,对象的方法attribValue标签的属性值
字符串名称=proElement.attributeValue("名称");
字符串值=proElement.attributeValue("value");
//属性值名称、JavaBean对象中的成员变量名称、属性值value、成员变量的值
//BeanUtils工具类的方法setProperty
BeanUtils.setProperty(obj,名称,值);
}
System.out.println(obj);
}
【深入解析Java开发中的BeanUtils工具类】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
听起来很方便啊,代码量能少很多。
有18位网友表示赞同!
之前自己都写属性拷贝逻辑,这工具可太实用了。
有20位网友表示赞同!
不知道能不能处理复杂的引用类型?
有5位网友表示赞同!
想了解一下兼容性如何?支持各种Java版本吗?
有12位网友表示赞同!
有Demo吗?可以看看具体用法。
有16位网友表示赞同!
以前每次都要手动遍历复制属性,现在可以用工具了省事多了。
有11位网友表示赞同!
学习起来简单吗?文档有没有写得清楚易懂?
有9位网友表示赞同!
这么好的工具应该早点知道!
有15位网友表示赞同!
这工具类能解决很多常见的开发问题吧?
有13位网友表示赞同!
感觉比自己写代码要高效太多了。
有6位网友表示赞同!
可以用它来简化数据之间的转换吗?
有7位网友表示赞同!
在项目中使用会提升效率多少呢?
有17位网友表示赞同!
需要额外依赖哪些库吗?
有9位网友表示赞同!
有没有其他类似的工具?哪个更好用?
有19位网友表示赞同!
这工具类开源的吗?能自己修改吗?
有9位网友表示赞同!
想听听大家使用它的体验,有什么坑吗?
有10位网友表示赞同!
是不是可以用在web开发里?
有6位网友表示赞同!
该工具的作者是谁啊?
有8位网友表示赞同!
这个名称听起来很有专业的感觉。
有15位网友表示赞同!
以后写代码遇到属性拷贝,就用这个工具了!
有13位网友表示赞同!