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

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

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

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

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

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

          

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

      

 package Introspect;

 import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field; public class ReflectionToPruduceObj { public static void main(String[] args) { } // 根据配置文件的内容来生产对象的对象,并且把对象的属性值也封装到生产的对象中去
public static Object getInstance() throws Exception{
//step 1 : 用文件流来读取文件
BufferedReader bufferedReader = new BufferedReader(new FileReader("obj.txt"));
//step 2 : 读取配置文件获取完整的类名
String classname = bufferedReader.readLine();
Class clazz = Class.forName(classname);
//step 3 : 通过Class对象获取无参的构造方法
Constructor constructor = clazz.getConstructor();
//step 4 : 通过构造方法创建对象
Object o = constructor.newInstance(null);
//step 4 : 将对象的对属性值封装到创建的属性中去
String line = null;
while((line = bufferedReader.readLine())!= null){
String[] dataStrings = line.split("=");// 这里是将属性的每一行按照等号左右来分开装如数组当中
// step 4.1 通过属性名来获取对应的Field对象
Field field = clazz.getDeclaredField(dataStrings[0]);
if(field.getType() == int.class){
field.set(o, Integer.parseInt(dataStrings[1]));
}else{
field.set(o, dataStrings[1]);
}
}
return o;
} }

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

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

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

package Introspect;

import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method; import org.junit.Test; public class PeipertyDescrip {
@Test
public void testAllProperties() throws Exception {
//introspector 这个就是内省类
BeanInfo beanInfo = Introspector.getBeanInfo(Member.class);
PropertyDescriptor[] descriptors = beanInfo.getPropertyDescriptors();
for (PropertyDescriptor propertyDescriptor : descriptors) {
System.out.println(propertyDescriptor.getReadMethod());
}
} @Test
public void testPropertyDescriptor() throws Exception {
Member member = new Member(); // 属性描述器
PropertyDescriptor descriptor = new PropertyDescriptor("id", Member.class);
Method setIdMethod = descriptor.getWriteMethod(); // 其实就是得到这个属性的set方法
setIdMethod.invoke(member, 4); Method getIdMethod = descriptor.getReadMethod();// 这是获取属性的get方法
System.out.println(getIdMethod.invoke(member,null)); System.out.println(member);
} }

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

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

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

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

package Introspect;
import java.lang.reflect.InvocationTargetException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date; import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.Converter; public class UseBeanUtils {
public static void main(String[] args) throws Exception {
Member member = new Member(); String id = "01";
String name = "王倩楠";
String passWord = "1997";
String birthday = "1997-11-18"; ConvertUtils.register(new Converter() { public Object convert(Class type, Object value) {
Date date = null; SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
try {
date = dateFormat.parse((String) value);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
}, Date.class); BeanUtils.setProperty(member, "id", id);
BeanUtils.setProperty(member, "name", name);
BeanUtils.setProperty(member, "passWord", passWord);
BeanUtils.setProperty(member, "birthday", birthday); System.err.println(member);
}
}

        

    在这里要注意几点使用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. Linux C++中的时间函数(转)

    http://net.pku.edu.cn/~yhf/linux_c/function/03.html   asctime(将时间和日期以字符串格式表示) 相关函数 time,ctime,gmtime ...

  2. Nginx设置线程数为整机内核数的俩倍!

    Nginx设置线程数为整机内核数的俩倍!

  3. highcharts饼状图使用案例

    在公司由于需要对订单数据进行分析,故使用到了highcharts工具 <block name="Js"> <script type="text/java ...

  4. JS学习:第二周——NO.2正则

    1.[正则] 就是用来操作(匹配和捕获)的一系列规则: 匹配:校验字符串是否符合我们的规则:返回值--布尔值           匹配这里用的是正则的方法:test(),reg.text( ); 捕获 ...

  5. 关于Access restriction: The type 'Application' is not API (restriction on required library)

    原文链接:http://rxxluowei.iteye.com/blog/671893 今天写第一次写JavaFX的入门程序就GG 遇到了导入API的问题,无奈疯狂地通过网络找解决方案.. 我的问题是 ...

  6. 在linux下使用curl访问 多参数url GET参数问题

    一.在Crontab中使用PHP执行脚本 就像在Crontab中调用普通的shell脚本一样(具体Crontab用法),使用PHP程序来调用PHP脚本.每一小时执行myscript.php如下: # ...

  7. dreamweaver cs6 mac破解版

    http://www.sdifenzhou.com/dreamweaver-cs6-mac.html

  8. 【JavaScript】--重点解析之跨域请求

    JSON JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. JSON是用字符串来表示Javascript对象,例如可以在django中发送一个JSON格式 ...

  9. October 27th Week 44th Thursday 2016

    The art of being wise is the art of knowing what to overlook. 智慧之道在于懂得该忽略什么. Always do your best. Wh ...

  10. 分享一个常用Adb命令

    分享一个常用Adb命令 首先 首先感谢@xuxu的常用adb命令,收益良多,但是已经不能满足于我,所以补充了下. 再者 好久没发帖了,最近论坛老司机们都在讨论/总结,我就用这个干货回报吧. 最后 基于 ...