JAVABeanUtils
在写如何使用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的更多相关文章
- JavaBean和内省
		JavaBean和内省 JavaBean是一个遵循特定的写法的java类 1. 必须有一个无参的构造方法 2.属性私有化 3.私有你给的属性必须通过public类型的方法暴露给 ... 
- 链接oracle数据库 生成表对应的javabean
		package com.databi.utils; import java.io.File; import java.io.FileOutputStream; import java.io.IOExc ... 
- map2bean & bean2map
		1,自己实现: /** * @author xx * @since 2020/7/8 */ @Slf4j public class JavaBeanUtils { /** * 实体类转map * 效率 ... 
随机推荐
- 【UWP】通过特定URI打开Win10指定设置页面[转]
			系统设置其实也是一个Modern应用,它与ms-settings:协议进行了关联. 在设置应用中的每一个具体的设置页面都有一个URI(统一资源标识符)与之对应,通过这些URI就可以直达某个具体的设置页 ... 
- java多线程操作
			进程是程序的一次动态的执行过程,它经历了从代码加载.执行完毕的一个完整过程,这个过程也是进程本身从产生.发展到最终消亡的过程. 多线程是实现并发机制的一种有效的手段.进程和线程一样,都是实现并发的一个 ... 
- 前端构建工具之gulp(一)「图片压缩」
			前端构建工具之gulp(一)「图片压缩」 已经很久没有写过博客了,现下终于事情少了,开始写博吧 今天网站要做一些优化:图片压缩,资源合并等 以前一直使用百度的FIS工具,但是FIS还没有提供图片压缩的 ... 
- iOS小知识:计算字符串长度(如果有表情,表情的长度为1)
			在做项目的时候,textField能够输入表情,但是iOS的表情是占两个字符的,再计算字符串长度的时候就和想象的不一样了,所以用了次方法会将表情的长度转成1,最后得到的字符串的长度就是能看到的实际的长 ... 
- windows安装zookeeper-单机模式
			zookeeper下载地址:http://zookeeper.apache.org/releases.html#download 本次使用的是3.4.9版本 前提:请安装JDK 安装: 创建安装目 ... 
- 页面滚动到底部自动 Ajax 获取文章
			页面滚动到底部自动 Ajax 获取文章 代码如下 复制代码 var _timer = {};function delay_till_last(id, fn, wait) { if (_time ... 
- 使select文本框可编辑可选择(jQuery插件)
			最近做项目中用到了这个插件,正好分享下. 1. 需要用的js包点击下载,在项目中引入该js. <script src="${pageContext.request.contextPa ... 
- 纯CSS弹出菜单(不支持IE6.0以下)
			<!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml"> ... 
- C++11智能指针读书笔记;
			智能指针是一个类对象,而非一个指针对象. 原始指针:通过new建立的*指针 智能指针:通过智能指针关键字(unique_ptr, shared_ptr ,weak_ptr)建立的指针 它的一种通用实现 ... 
- 在WebPart中获取Office 365中的未读邮件数
			// Create the web request HttpWebRequest request = WebRequest.Create("https://outlook.office365 ... 
