背景

一般情况下,在Java中你可以通过get方法轻松获取beans中的属性值。但是,当你事先不知道beans的类型或者将要访问或修改的属性名时,该怎么办?Java语言中提供了一些像java.beans.Introspector这样类,实现了在运行时检测Java类并确定属性get和set方法的名称,结合Java中的反射机制就可以调用这些方法了。然而,这些APIs使用起来比较困难,并且将Java类中一些不必要的底层结构暴露给了开发人员。BeanUtils包中的APIs试图简化动态获取和设置bean属性的过程。

BeanUtils包中的PropertyUtils类中的一些静态方法实现了上面的功能,稍后会详细介绍。首先,介绍一些有用的定义:

JavaBean支持的属性类型一般可以划分成三类--标准的JavaBeans规范支持其中的一些,也有一部分只有BeanUtils包支持:

Simple(单值)  --  单值或量,有个一可以访问或修改的属性。值的类型可能是Java语言的原生类型(如:int型),简单的类(如:java.lang.String),或者一个复杂类的对象,这个类可能来自Java语言或者来自应用程序再或者来自应用程序中的一个类库。

Indexed(索引)  --   索引的属性,属性中存放有序对象(都是同类型的)的集合,每个对象都可以通过一个非负的整数值(或下标)来获取。另外,所有值的集合可以使用一个数组来设置或者获取。作为一个JavaBeans规范的扩展,BeanUtils包认为所有底层数据类型为java.util.List(或List的一个实现)的属性都可以被索引。

Mapped(映射)  --  作为一个标准JavaBeans APIs的扩展,  BeanUtils包认为所有底层数据类型为java.util.Map的属性都可以被"映射"。你可以通过String类型的key值来设置或者获取对应的值。

PropertyUtils类中提供了各种API方法用来获取和设置上述三种类型的属性。在下面的程序片段中,假设在bean类中都定义了如下的方法:

public class Employee {

public Address getAddress(String type);

public void setAddress(String type, Address address);

public Employee getSubordinate(int index);

public void setSubordinate(int index, Employee subordinate);

public String getFirstName();

public void setFirstName(String firstName);

public String getLastName();

public void setLastName(String lastName);访问基本属性

获取和设置simple属性很简单。在Javadocs中查看下面两个方法:

PropertyUtils.getSimpleProperty(Object bean, String name)

PropertyUtils.setSimpleProperty(Object bean, String name, Object value)

使用这两个方法,你可以动态地修改employee的name属性:

Employee employee = ...;

String firstName = (String) PropertyUtils.getSimpleProperty(employee, "firstName");

String lastName = (String) PropertyUtils.getSimpleProperty(employee, "lastName");

... manipulate the values ...

PropertyUtils.setSimpleProperty(employee, "firstName", firstName);

PropertyUtils.setSimpleProperty(employee, "lastName", lastName);      对于indexed(索引)属性,你有两种选择 - 你既可以在属性名后面添加方括号在里面放上一个下标,也可以在调用方法时将其作为一个独立参数:

PropertyUtils.getIndexedProperty(Object bean, String name)

PropertyUtils.getIndexedProperty(Object bean, String name, int index)

PropertyUtils.setIndexedProperty(Object bean, String name, Object value)

PropertyUtils.setIndexedProperty(Object bean, String name, int index, Object value)

属性名的下标只能是整数常量。如果你想获取的项的索引是计算出来的,你可以将属性名和索引作为字符串组合起来。例如,你可以向下面这样做:

Employee employee = ...;

int index = ...;

String name = "subordinate[" + index + "]";

Employee subordinate = (Employee) PropertyUtils.getIndexedProperty(employee, name);

Employee employee = ...;

int index = ...;

Employee subordinate = (Employee) PropertyUtils.getIndexedProperty(employee, "subordinate", index);      类似的,获取和设置mapped(映射)属性的方法同样有两对。与indexed(索引)不同的是额外的属性是用括号括起来的(“(”和“)”)而不是方括号,并且获取和设置值时如同从底层的map中获取和设置值一样。

PropertyUtils.getMappedProperty(Object bean, String name)

PropertyUtils.getMappedProperty(Object bean, String name, String key)

PropertyUtils.setMappedProperty(Object bean, String name, Object value)

PropertyUtils.setMappedProperty(Object bean, String name, String key, Object value)

例如,你可以使用下面两种方法设置employee的家庭住址:

Employee employee = ...;

Address address = ...;

PropertyUtils.setMappedProperty(employee, "address(home)", address);

Employee employee = ...;

Address address = ...;

PropertyUtils.setMappedProperty(employee, "address", "home", address);访问嵌套属性

在上面的例子中,我们假设你将bean作为第一个参数传入PropertyUtils方法,并希望获取指定属性的值。然而,如果属性的值是一个Java对象,并且你希望进一步获取这个Java对象的某个属性的值?

例如,假设你事实上想要获取的值是employee家庭住址中的city属性。使用标准的Java编程技术直接获取bean的对应属性,你可以这样写:

String city = employee.getAddress("home").getCity();      使用PropertyUtils类中的等效机制被称为嵌套属性访问。使用这种方法,你将访问路径上的属性的名称用“.”拼接起来 --

与你在JavaScript执行嵌套属性访问的方式非常相似。

PropertyUtils.getNestedProperty(Object bean, String name)

PropertyUtils.setNestedProperty(Object bean, String name, Object value)

PropertyUtils中等效于上面的Java代码将是这样:

String city = (String) PropertyUtils.getNestedProperty(employee, "address(home).city");      最后,方便起见,PropertyUtils提供了如下一组方法,它们接收simple、indexed和mapped属性的任意组合方法,支持任意层次的嵌套:

PropertyUtils.getProperty(Object bean, String name)

PropertyUtils.setProperty(Object bean, String name, Object value)

你可以像这样使用:

Employee employee = ...;

String city = (String) PropertyUtils.getProperty(employee, "subordinate[3].address(home).city");

java中映射getproperty,PropertyUtils.getProperty和PropertyUtils.setProperty的用法详解相关推荐

  1. java中printf,print,println,区别及用法详解

    此题是蓝桥杯的一道竞赛试题,在编写程序时,遇到了printf的用法,不是很熟悉,特此总结一下. 以下是对Java中print.printf.println的区别进行了详细的分析介绍,需要的朋友可以过来 ...

  2. java中刷新js函数,js刷新页面location.reload()用法详解

    本文介绍了js刷新页面函数location.reload()的用法,有关js location.reload()函数的例子,有需要的朋友参考下. 在javascript编程中,多使用location. ...

  3. java中String s=abc及String s=new String(abc)详解

    java中String s="abc"及String s=new String("abc")详解 1.   栈(stack)与堆(heap)都是Java用来在R ...

  4. python中ndim是什么_Numpy中ndim、shape、dtype、astype的用法详解

    本文介绍numpy数组中这四个方法的区别ndim.shape.dtype.astype. 1.ndim ndim返回的是数组的维度,返回的只有一个数,该数即表示数组的维度. 2.shape shape ...

  5. ios开发读取剪切板的内容_iOS中管理剪切板的UIPasteboard粘贴板类用法详解

    一.自带剪切板操作的原生UI控件在iOS的UI系统中,有3个控件自带剪切板操作,分别是UITextField.UITextView与UIWebView.在这些控件的文字交互处进行长按手势可以在屏幕视图 ...

  6. java 生成dump_java dump文件怎么生成和分析-JMAP用法详解

    jmap是java自带的工具 1. 查看整个JVM内存状态 jmap -heap [pid] 2. 查看JVM堆中对象详细占用情况 jmap -histo [pid] 3. 导出整个JVM 中内存信息 ...

  7. java设计模式观察者模式吗_Java设计模式之观察者模式原理与用法详解

    Java设计模式之观察者模式原理与用法详解 本文实例讲述了Java设计模式之观察者模式原理与用法.分享给大家供大家参考,具体如下: 什么是观察者模式 可以这么理解: 观察者模式定义了一种一对多的依赖关 ...

  8. java写mapstate算子,vuex state及mapState的基础用法详解

    vuex state及mapState的基础用法详解 2019-01-07 编程之家收集整理的这篇文章主要介绍了vuex state及mapState的基础用法详解,编程之家小编觉得挺不错的,现在分享 ...

  9. 【26天高效学习Java编程】Day22:Java中的属性集-缓冲流-转换流-序列化流详解

    本专栏将从基础开始,循序渐进,由浅入深讲解Java的基本使用,希望大家都能够从中有所收获,也请大家多多支持. 专栏地址:26天高效学习Java编程 相关软件地址:软件地址 所有代码地址:代码地址 如果 ...

  10. java中循环语句_Java语法基础之循环结构语句详解

    一.循环结构 循环语句可以在满足循环条件的情况下,反复执行某一段代码,这段被重复执行的代码被称为循环体语句,当反复执行这个循环体时,需要在合适的时候把循环判断条件修改为false,从而结束循环,否则循 ...

最新文章

  1. SAP PM 初级系列16 - 设备相关的Asset号
  2. 网易云课堂计算机体系,计算机系统结构 (三) CPU及其结构分析
  3. envs\TensorFlow2.0\lib\site-packages\tensorflow\python\framework\dtypes.py:516: FutureWarning 解决方案
  4. 怎么把图片四角去掉_端午“粽子”怎么做,有哪几种包法,嘉兴粽子闻名全国,软糯可口...
  5. .net/c#中栈和堆的区别及代码在栈和堆中的执行流程详解之一(转)
  6. linux软件卸载不了,linux软件卸载
  7. 史玉柱吃透了中国人的人性,也引发了争议
  8. C++Primer Plus第6版C Primer Plus第6版 中文版免费分享啦
  9. Blocs 4 for Mac(可视化网页设计工具)
  10. 黑客帝国屏幕保护设置
  11. Linux基础学习笔记整理——第二章 管理文件和目录
  12. Java自学视频整理(持续更新中...) .
  13. 解锁虚拟服务器,华为解锁码忘记了可以用云服务器
  14. 发现最新的区块链应用-8月16日
  15. 55400-73-2,Ms-PEG5-Ms含有两个甲磺酸基部分的PEG连接物
  16. C语言程序设计现代方法(第二版)十二章课后练习题部分答案
  17. 2022年Android官方模拟器安装Xposed教程+测试工具PatDroid安装教程
  18. android 关于刷app下载量的问题
  19. norflash/nandflash 启动分析 转
  20. 快手怎么引流做CPA?如何在快手直播上截流操作CPA项目

热门文章

  1. vsftpd配置详解
  2. 人工势场法matlab讲解_【机器人路径规划】人工势场法
  3. 软考——IP计算问题那点事
  4. docker自动部署脚本
  5. 《电力电子技术》王兆安 第二章
  6. 直流稳压电源设计(单相)_电力电子课程设计
  7. python贪吃蛇_python实现贪吃蛇
  8. 帆软报表嵌入python程序_C#教程之C#服务器端生成报告文档:使用帆软报表
  9. IE改善七大手法| ECRS工时分析软件
  10. opencv实现阈值分割