首页 > 其他分享 >BeanUtils使用总结

BeanUtils使用总结

时间:2023-05-24 12:32:34浏览次数:30  
标签:总结 getProperty String color ArrayList 使用 BeanUtils public



[color=red][size=x-large]Commons- BeanUtils学习笔记[/size][/color


[color=red][b]1、 BeanUtils一共分4个包:[/b][/color]

[b] org.apache.commons.beanutils
org.apache.commons.beanutils.converters
org.apache.commons.beanutils.locale
org.apache.commons.beanutils.locale.converters[/b]

其中上面两个是BeanUtils的默认实现,它没有针对本地化的任何处理,这个可以提高执行效率。
但是若你的程序对于本地化有要求的话,那还是使用下面2个包比较安全。

org.apache.commons.beanutils

这个包主要提供用于操作JavaBean的工具类,Jakarta-Common-BeanUtils的主要功能都在这个包里实现。



[color=red][b]2、BeanUtils可以直接get和set一个属性的值。它将property分成3种类型[/b][/color]:

Simple——简单类型,如Stirng、Int……

Indexed——索引类型,如数组、arrayList……

Maped——这个不用说也该知道,就是指Map啦,比如HashMap……

访问不同类型的数据可以直接调用函数getProperty和setProperty。getProperty只有2个参数,第一个是JavaBean对象,第二个是要操作的属性名;setProperty提供三个参数,第一是JavaBean对象,第二个是要操作的属性名,第三个为要设置的具体的值

package com.test;

import java.util.ArrayList;
import java.util.HashMap;

public class Company {
	private String name;
	private HashMap address = new HashMap();
	private String[] otherInfo;
	private ArrayList product;
	private ArrayList employee;
	private HashMap telephone;

	public Company() {
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getAddress(String type) {
		return address.get(type).toString();
	}

	public void setAddress(String type, String address) {
		this.address.put(type, address);
	}

	public String[] getOtherInfo() {
		return otherInfo;
	}

	public void setOtherInfo(String[] otherInfo) {
		this.otherInfo = otherInfo;
	}

	public ArrayList getProduct() {
		return product;
	}

	public void setProduct(ArrayList product) {
		this.product = product;
	}

	public ArrayList getEmployee() {
		return employee;
	}

	public void setEmployee(ArrayList employee) {
		this.employee = employee;
	}

	public HashMap getTelephone() {
		return telephone;
	}

	public void setTelephone(HashMap telephone) {
		this.telephone = telephone;
	}
}



[b](1)Simple[/b]


//对于Simple类型,参数二直接是属性名即可
 System.out.println(BeanUtils.getProperty(c, "name"));



[b](2)Map[/b]


//对于Map类型,则需要以“属性名(key值)”的形式
 System.out.println(BeanUtils.getProperty(c, "address (A2)"));
 HashMap am = new HashMap();
am.put("1","234-222-1222211");
am.put("2","021-086-1232323");
 BeanUtils.setProperty(c,"telephone",am);
System.out.println(BeanUtils.getProperty(c, "telephone (2)"));



Map类型也可以采用BeanUtils.getMappedProperty(c, "address","A2");



[b](3)index[/b]


//对于Indexed,则为“属性名[索引值]”,注意这里对于ArrayList和数组都可以用一样的方式进行操作。


System.out.println(BeanUtils.getProperty(c, "otherInfo[2]"));
BeanUtils.setProperty(c, "product[1]", "NOTES SERVER");
System.out.println(BeanUtils.getProperty(c, "product[1]"));



index类型还可以采用BeanUtils.getIndexedProperty(c,"product",1);



(4)nest 3种类也可以组合使用啦!


System.out.println(BeanUtils.getProperty(c, "employee[1].name"));



[color=red][b]3、bean copy功能 [/b][/color]


Company c2 = new Company();
       BeanUtils.copyProperties(c2, c);



但是这种copy都是浅拷贝,复制后的2个Bean的同一个属性可能拥有同一个对象的ref,这个在使用时要小心,特别是对于属性为自定义类的情况




[color=red][b]4、 BeanUtils和PropertyUtils[/b][/color]


这两个类几乎有一摸一样的功能,唯一的区别是:BeanUtils在对Bean赋值是会进行类型转化。举例来说也就是在copyProperty时只要属性名相同,就算类型不同,BeanUtils也可以进行copy;而PropertyBean则可能会报错!!


针对上面的例子,新建一个Company2的类,其中代码与Company一样,只是将otherinfo从String[]改为String。


Company c = init();
      Company2 c2 = new Company2();

      BeanUtils.copyProperties(c2,c);
//    PropertyUtils.copyProperties(c2,c); 这句会报错!!
      System.out.println(c2.getOtherInfo());


当然2个Bean之间的同名属性的类型必须是可以转化的,否则用BeanUtils一样会报错。


若实现了org.apache.commons.beanutils.Converter接口则可以自定义类型之间的转化。


由于不做类型转化,用PropertyUtils在速度上会有很大提高!


此外,不作类型转化还有一个好处,如下面的代码:


//test data type convert
//    ArrayList a1 = BeanUtils.getProperty(c,"product"); //BeanUtils返回的是String
      System.out.println("--" + BeanUtils.getProperty(c,"product"));     //取出后直接被转为String
      ArrayList a = (ArrayList)PropertyUtils.getProperty(c,"product");//PropertyUtils返回的是Object
      System.out.println("--" + a.get(1));


用BeanUtils无法返回一个对象(除非自己写一个Converter),它会自动进行类型转化,然后返回String。对于想返回java类或自定义类的话,还是请使用PropertyUtils



[color=red][b]5、Utils类[/b][/color]


所有的XXXUtils类都提供的是静态方法,可以直接调用,其主要实现都在相应的XXXUtilsBean中:


BeanUtils ——> BeanUtilsBean


ConvertUtils ——> ConvertUtilsBean


PropertyUtils ——> PropertyUtilsBean


[b](1)PropertyUtils,获取属性的Class类型[/b]


public static Class getPropertyType(Object bean, String name)


[b](2)ConstructorUtils,动态创建对象[/b]


public static Object invokeConstructor(Class klass, Object arg)


[b](3)MethodUtils,动态调用方法[/b]


MethodUtils.invokeMethod(bean, methodName, parameter);


标签:总结,getProperty,String,color,ArrayList,使用,BeanUtils,public
From: https://blog.51cto.com/u_3871599/6338521

相关文章

  • golang使用小技巧
    封装gorouting并捕捉panic从k8s源码中学到的,觉得小而精,感觉比定时器好用呢k8s源码中是这样使用的//每隔peroid后就执行传入的函数funcForever(ffunc(),periodtime.Duration){ for{ func(){ deferHandleCrash()//捕捉函数中的panic f() }() time.Sleep(per......
  • ROS2指令总结
    查看功能ros2nodelistros2topiclistros2servicelistros2actionlist查看节点信息:ros2nodeinfo<node_name>话题ros2topicecho<topic_name>查看话题的详细信息:ros2topicinfo<topic_name>查看话题的数据类型:ros2topiclist-t查看数据类型的具......
  • 如何在 Linux 中安装和使用 duf 命令
    导读今天我们来分享一下如何在 Linux 中安装和使用duf 命令。该命令显示磁盘空间的利用率,显示方式如下图所示:​duf命令是du命令和​​​df命令​​​​的一个结合,且结果输出是以更加易读的结构化方式,来检查系统空间。其显示跟易读,对不?今天我们来分享一下如何......
  • windows环境下的vue部署(使用nginx)
    首先需要将vue项目打包成dist,在需要部署的服务器上进行解压然后我们使用nginx进行反向代理设置,具体操作如下打开解压后的nginx,进入目录:nginx-1.23.4->conf,打开编辑nginx.conf*注意:对于后端路径的映射这里一定是^~/前缀/对应于地址的端口/前缀/,这里一定是两个//包裹。以下......
  • flask框架使用unittest单元测试
    user_labels_api.py1#-*-coding:utf-8-*-2#Author:Ethan3#Time:2023/5/1612:504fromflaskimportFlask,jsonify,render_template,request,json5importrequests6#fromflask_sqlalchemyimportSQLAlchemy7app=Flask(__name__)8#bd......
  • SpringBoot中使用枚举类、switch、常量类(声明并初始化map)实现类策略者模式,接口返回
    场景SpringBoot中策略模式+工厂模式业务实例(接口传参-枚举类查询策略映射关系-执行不同策略)规避大量if-else:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/130503707SpringBoot+@Validate+全局异常拦截实现自定义规则参数校验(校验get请求参数不能为空且在指定......
  • 使用QtCreator C++编写串口调试助手
    Qt小白一枚,喜欢嵌入式应用,以前都是使用别人的串口调试助手,学习了C++以后,自己也尝试着做了简单的串口调试助手,分享给大家吧,希望能帮助到大家,如果有错误,请大家指正。话不多说开干!1.首先看一下我设计的界面(我这里比较简单,大家可根据自己的需求进行设计)(界面设计的过程中,每一个控件......
  • python运行使用pywin32下载及安装问题
     1、python执行报错File"F:\XXX\XXX.py",line7,in<module> 运行python程序,提示错误如下:importwin32gui ModuleNotFoundError:Nomodulenamed'win32gui'该报错信息表示在F:\XXX\XXX.py中的第7行引入了win32gui,但是当前设备缺少pywin32的模块,需要安装安装方式一:直......
  • vue中<script setup>中使用watch、computed、props、defineExpose、defineEmits等方法
    <scriptsetup>是在单文件组件(SFC)中使用组合式API的编译时语法糖。相比于普通的<script>语法,它具有更多优势:更少的样板内容,更简洁的代码。能够使用纯TypeScript声明props和抛出事件。更好的运行时性能(其模板会被编译成与其同一作用域的渲染函数,没有任何的中间......
  • Python如何自动生成文档,pdoc类库的使用
    pdoc是一个基于Python的自动文档生成工具,可以生成Python模块、类和函数的API文档。它可以将代码注释和文档字符串自动转换为HTML文档,使得开发者可以轻松地生成文档,并分享给其他人。本教程将介绍如何安装和使用pdoc生成PythonAPI文档。安装pdoc在安装pdoc之前,需要确保已经安装了Pyt......