在写如何使用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. C# WinForm 技巧:COMBOBOX搜索提示

    comboBox和textBox支持内置的搜索提示功能, 在form的InitializeComponent()中添加如下语句:   this.comboBox1.AutoCompleteCustom ...

  2. @RequestParam @RequestBody @PathVariable 等参数绑定注解详解

    文章主要讲解request 数据到handler method 参数数据的绑定所用到的注解和什么情形下使用. 简介: handler method 参数绑定常用的注解,我们根据他们处理的Request ...

  3. Java BigDecimal 转换,除法陷阱(转)

    源地址:   http://blog.csdn.net/niannian_315/article/details/24354251 今天在用BigDecimal“出现费解”现象,以前虽然知道要避免用, ...

  4. GetWord 3.3 屏幕取词

    1. 缘起 要搞一个作弊软件,需要把屏幕上的试题取下来. 据说针对IE的取词很难,所以也就打消了自己开发的念头,找一找好用的控件. 发现了两个可以用的,一个是金山词霸的XdictGrb.dll文件,一 ...

  5. 11个审查Linux是否被入侵的方法

    11个审查Linux是否被入侵的方法 一.检查系统日志 lastb命令 检查系统错误登陆日志,统计IP重试次数 二.检查系统用户 1.cat /etc/passwd 查看是否有异常的系统用户 2.gr ...

  6. js 对象合并

    //条件 var obj1 = { food: 'pizza', car: 'ford' } var obj2 = { animal: 'dog' } //需求如下 obj1.merge(obj2); ...

  7. yum 保存下载包

    --- 1 --- $ sudo yum install yum-plugin-downloadonly $ sudo yum install --downloadonly --downloaddir ...

  8. 基于TXT文本的简单图书管理系统

    1 ////////////////////////////////////////////////////////////////////////////////////// //SqList.h ...

  9. opengl es中不同的绘制方式

    opengl es中不同的绘制方式 转载请保留出处:http://xiaxveliang.blog.163.com/blog/static/297080342013467344263/ 1. GL_P ...

  10. Linux kilin 安装和按键服务器步骤

    U盘启动,傻瓜式安装 设置root 密码 sudo passwd root vsftpd和ssh服务 使用apt-get可以直接安装vsftpd和ssh,首先要sudo apt-get update ...