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 * 效率 ...
随机推荐
- Spring 的动态数据源实现
1. 配置多个数据源 这里以两个c3p0数据库连接池的数据源作为实例.在Spring框架下使用c3p0的数据库需要加入c3p0-0.9.1.2.jar(现在最新的)这个支持包.这里以数据同步项目为例: ...
- 记录下WIN下配置LINUX虚拟机及PYTHON环境
因为听说服务器端大多都是LINUX/UNIX,LINUX是程序员必须适应的编程环境,所以今天折腾了一下,给笔记本装了个LINUX虚拟机,并顺便给WINDOWS和LINUX都配置了PYTHON环境. 这 ...
- java多线程操作
进程是程序的一次动态的执行过程,它经历了从代码加载.执行完毕的一个完整过程,这个过程也是进程本身从产生.发展到最终消亡的过程. 多线程是实现并发机制的一种有效的手段.进程和线程一样,都是实现并发的一个 ...
- Javascript面向对象特性实现封装、继承、接口详细案例——进级高手篇
Javascript面向对象特性实现(封装.继承.接口) Javascript作为弱类型语言,和Java.php等服务端脚本语言相比,拥有极强的灵活性.对于小型的web需求,在编写javascript ...
- The specified module could not be found
打开IIS 信息服务,在左侧找到自己的计算机,点右键,选择属性,在主属性中选编辑,打开“目录安全性”选项卡,单击“匿名访问和验证控制”里的“编辑”按钮,在弹出的对话框中确保只选中了“匿名访问”和“集成 ...
- CSS3 media 入门
css3 media 严格来说是自适应布局 对不同的屏幕(正确的说应该是) 写不同的css样式.而流式布局 则才算是响应式布局. css3 media 语法: @media mediatype a ...
- 不得不说的wepapi 优化
1:在你的ASP.NET Web API中使用GZIP 或 Deflate .对于减少响应包的大小和响应速度,压缩是一种简单而有效的方式.这是一个非常有必要使用的功能,你可以查看更多关于压缩的文章在我 ...
- win10进入安全模式的方法(F8不管用/开不开机)
win10默认不能进入安全模式,这时候开机黑屏怎么办?下面介绍强制进入安全模式的方法 1. 关机情况下,按开机键开机,等到出现徽标(下图),这时候长按开机键强制关机. 2. 再次开机,出现徽标,再次强 ...
- ASP.NET SignalR入门
前言 之前在培训ASP.NET WebAPI的时候有提过SignalR这个技术,但当时只是讲了是用来做什么的,并没有多说.因为自己也是画图找资料的时候见到的.后来当一直关注的前端大神贤心发布LayIM ...
- spring+redis 集群下的操作
文章就是记录一下工作当中的用到的点,与测试方法以备用,会不断更新. 配置文件spring-redis.xml: <?xml version="1.0" encoding=&q ...