在写如何使用java BeanUlits 之前需要清楚几件事情

1. 我们每次所定义的类,其实是实体,同时也被称作为JavaBean;

2.  为什么我们要使用BeanUlits这个框架

       >在解决上面这个问题之前,我们得先搞清楚一件事情就是,在我们写javaWeb后端程序的时候,往往是拿到配置文件--xml格式的,而我们要做是将里面的数据对象变成我们的实例对象,也就是我们要做的事情就是将拿到的数据对象的属性复制到我们在程序中的实例化的对象属性,想做到这一步,其实是可以用反射的机制的。

    •下面我来模拟一下这一过程

      (1) 先在工程下新建一个txt文件来模拟一个配置的文件,如下图

          

    (2) 接下来我们实现一个常见的需求 -- 写出一个工厂方法,根据文件的内容来返回对应的对象,并且要相应的属性值

      

  1. package Introspect;
  2.  
  3. import java.io.BufferedReader;
  4. import java.io.FileInputStream;
  5. import java.io.FileNotFoundException;
  6. import java.io.FileReader;
  7. import java.io.IOException;
  8. import java.lang.reflect.Constructor;
  9. import java.lang.reflect.Field;
  10.  
  11. public class ReflectionToPruduceObj {
  12.  
  13. public static void main(String[] args) {
  14.  
  15. }
  16.  
  17. // 根据配置文件的内容来生产对象的对象,并且把对象的属性值也封装到生产的对象中去
  18. public static Object getInstance() throws Exception{
  19. //step 1 : 用文件流来读取文件
  20. BufferedReader bufferedReader = new BufferedReader(new FileReader("obj.txt"));
  21. //step 2 : 读取配置文件获取完整的类名
  22. String classname = bufferedReader.readLine();
  23. Class clazz = Class.forName(classname);
  24. //step 3 : 通过Class对象获取无参的构造方法
  25. Constructor constructor = clazz.getConstructor();
  26. //step 4 : 通过构造方法创建对象
  27. Object o = constructor.newInstance(null);
  28. //step 4 : 将对象的对属性值封装到创建的属性中去
  29. String line = null;
  30. while((line = bufferedReader.readLine())!= null){
  31. String[] dataStrings = line.split("=");// 这里是将属性的每一行按照等号左右来分开装如数组当中
  32. // step 4.1 通过属性名来获取对应的Field对象
  33. Field field = clazz.getDeclaredField(dataStrings[0]);
  34. if(field.getType() == int.class){
  35. field.set(o, Integer.parseInt(dataStrings[1]));
  36. }else{
  37. field.set(o, dataStrings[1]);
  38. }
  39. }
  40. return o;
  41. }
  42.  
  43. }

        有上述的例子可以看出,以后我们开发一些工具框架的时候,就需要将数据封装到对象中去,底层的实现就是用的反射

  从上面的代码可以看出,用反射来写是非常的麻烦的,所以sun公司就开发了一套工具叫做 内省--但是他其实也是一种封装好的反射

      >用内省也是将配置文件对象的属性封装到新建的对象中去.

  1. package Introspect;
  2.  
  3. import java.beans.BeanInfo;
  4. import java.beans.IntrospectionException;
  5. import java.beans.Introspector;
  6. import java.beans.PropertyDescriptor;
  7. import java.lang.reflect.Method;
  8.  
  9. import org.junit.Test;
  10.  
  11. public class PeipertyDescrip {
  12. @Test
  13. public void testAllProperties() throws Exception {
  14. //introspector 这个就是内省类
  15. BeanInfo beanInfo = Introspector.getBeanInfo(Member.class);
  16. PropertyDescriptor[] descriptors = beanInfo.getPropertyDescriptors();
  17. for (PropertyDescriptor propertyDescriptor : descriptors) {
  18. System.out.println(propertyDescriptor.getReadMethod());
  19. }
  20. }
  21.  
  22. @Test
  23. public void testPropertyDescriptor() throws Exception {
  24. Member member = new Member();
  25.  
  26. // 属性描述器
  27. PropertyDescriptor descriptor = new PropertyDescriptor("id", Member.class);
  28. Method setIdMethod = descriptor.getWriteMethod(); // 其实就是得到这个属性的set方法
  29. setIdMethod.invoke(member, 4);
  30.  
  31. Method getIdMethod = descriptor.getReadMethod();// 这是获取属性的get方法
  32. System.out.println(getIdMethod.invoke(member,null));
  33.  
  34. System.out.println(member);
  35. }
  36.  
  37. }

    由图可见,有了内省类之后,主要功能是能够得到类中的set与get方法,从而来对类的属性进行设置,然后还可以拥有一个属性描述器的数组来对得到属性的get与set的方法,但是其实我觉得这种方式跟反射并没有什么两样,所以它可以看作是一种变态的反射而已,因为反射是直接可以拿到属性Flied 来做文章,只不过是priavte的时候,要添加些方法,而内省是直接拿到类的get与set方法,对类进行设置,当让这前提是要新增属性描述器.

      所以综上所看,这两种方法大同小异,但是都比较麻烦所以,apache公司就封装了内省这门技术,开发了beanutils这个工具包供我们使用,下面是使用方法

    (1) 首先你的引入BeanUtils这个包,这个方法同junit一样,然后,就可以直接使用了

    (2) 下面是我po出用BeanUtils的代码

  1. package Introspect;
  1. import java.lang.reflect.InvocationTargetException;
  2. import java.text.ParseException;
  3. import java.text.SimpleDateFormat;
  4. import java.util.Date;
  5.  
  6. import org.apache.commons.beanutils.BeanUtils;
  7. import org.apache.commons.beanutils.ConvertUtils;
  8. import org.apache.commons.beanutils.Converter;
  9.  
  10. public class UseBeanUtils {
  11. public static void main(String[] args) throws Exception {
  12. Member member = new Member();
  13.  
  14. String id = "01";
  15. String name = "王倩楠";
  16. String passWord = "1997";
  17. String birthday = "1997-11-18";
  18.  
  19. ConvertUtils.register(new Converter() {
  20.  
  21. public Object convert(Class type, Object value) {
  22. Date date = null;
  23.  
  24. SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
  25. try {
  26. date = dateFormat.parse((String) value);
  27. } catch (ParseException e) {
  28. e.printStackTrace();
  29. }
  30. return date;
  31. }
  32. }, Date.class);
  33.  
  34. BeanUtils.setProperty(member, "id", id);
  35. BeanUtils.setProperty(member, "name", name);
  36. BeanUtils.setProperty(member, "passWord", passWord);
  37. BeanUtils.setProperty(member, "birthday", birthday);
  38.  
  39. System.err.println(member);
  40. }
  41. }

        

    在这里要注意几点使用BeanUtils的事项:

      首先,要清楚BeanUtils是对内省这门技术的封装,所以它的底层也是由得到get与set方法来实现的,所以你的类里面是必须要有这两种方法的

      其次, Beanutils只能对基本数据类型和String类型来进行直接的设置,其余的java的一些封装的类,比如Date等,是需要引入转换器,ConvertUtils来注册一个转换器的,上面代码上也有,对于Date的转换器的注册,里面的转换器其实是一个接口,所以只要实现这个接口就可以直接使用,所以,我们直接写了一个内部类,来实现这个date的转换器,具体的实现方法,代码上都有体现。

现在来根据配置文件进行将对象的属性写入新创建的对象中就非常的方便了。

JAVABeanUtils的更多相关文章

  1. JavaBean和内省

    JavaBean和内省 JavaBean是一个遵循特定的写法的java类     1. 必须有一个无参的构造方法     2.属性私有化     3.私有你给的属性必须通过public类型的方法暴露给 ...

  2. 链接oracle数据库 生成表对应的javabean

    package com.databi.utils; import java.io.File; import java.io.FileOutputStream; import java.io.IOExc ...

  3. map2bean & bean2map

    1,自己实现: /** * @author xx * @since 2020/7/8 */ @Slf4j public class JavaBeanUtils { /** * 实体类转map * 效率 ...

随机推荐

  1. 分享10款非常有用的 Ajax 插件

    这篇文章与大家分享的是10款非常有用的 Ajax 插件,有用于图片的,用于分页的,还有用于导航的.这些作者的想法特别新颖,希望你能从中找到自己需要的插件. 1. AJAX-ZOOM 非常强大的一款插件 ...

  2. T1加权像(T1 weighted image,T1WI)

    T1加权成像(T1-weighted imaging,T1WI)是指这种成像方法重点突出组织纵向弛豫差别,而尽量减少组织其他特性如横向弛豫等对图像的影响. 弛豫:物理用语,从某一个状态恢复到平衡态的过 ...

  3. STM32f103 定时器之编码器接口模式

    背景 买了个Arduino的旋转编码器模块,配合STM32定时器的编码器模式实现了旋转角度以及圈数的计数.这种旋转编码器我能想到的实际应用场景暂时只有实体音量旋钮,鼠标的滚轮等,所以只实现了计数.阅读 ...

  4. python2.7 学习笔记--列表的使用

    同其它编程语言一样,python也提供了丰富的数据结构,以方便数据的处理.本文介绍两种最基本的数据集合,列表和元组的使用. 一.列表使用介绍 可以理解为一个有序的序列.其使用方式举例如下: list= ...

  5. 深度学习笔记——PCA原理与数学推倒详解

    PCA目的:这里举个例子,如果假设我有m个点,{x(1),...,x(m)},那么我要将它们存在我的内存中,或者要对着m个点进行一次机器学习,但是这m个点的维度太大了,如果要进行机器学习的话参数太多, ...

  6. 修改Firebug字体

    Firebug是一件非常好用的调试工具,然而默认的字体有些单调,设置里又没有更改的选项,那么字体到底能不能更改呢?这个问题困扰了我好久,直到今天我才偶然发现了解决方案. Firebug属于火狐的一个插 ...

  7. POJ 2226二分图最大匹配

    匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名.匈牙利算法是基于Hall定理中充分性证明的思想,它是二部图匹配最常见的算法,该算法的核心就是寻找增广路径,它是一种用增广路径求二分图 ...

  8. powershell使用

    主要语法点: -match -notmatch -replace -join -split -and -or -xor -not ! +.-.*./.% =.+=.-=.*=./=.%= -eq.-n ...

  9. Install PIL with Jpeg support on Raspbian Jessie

    参考: https://www.raspberrypi.org/forums/viewtopic.php?f=91&t=79379 在 树莓派(Raspbian Jessie) 上安装djan ...

  10. html中嵌入swf文件的几种方法

    转自:http://blog.163.com/yuki_1154/blog/static/7120277120126109315935/ 找了很久终于找到一个比较全面的: 1. object + em ...