在写如何使用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 * 效率 ...
随机推荐
-
树形DP codevs 1814 最长链
codevs 1814 最长链 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 现给出一棵N个结点二叉树,问这棵二叉树中 ...
-
java中线程池的使用方法
1 引入线程池的原因 由于线程的生命周期中包括创建.就绪.运行.阻塞.销毁阶段,当我们待处理的任务数目较小时,我们可以自己创建几个线程来处理相应的任务,但当有大量的任务时,由于创建.销毁线程需要很大的 ...
-
解决easyui和bootstrap兼容问题
在使用bootstrap和easyui的时候,发现很多有冲突的地方,包括datagrid控件和combo等,以下进行的问题修正,保证easyui正常显示 /*bootstrap兼容问题和easyui的 ...
-
linux下设置ip地址 gw网关,dns的方法
本文介绍下,在linux中设置IP地址.网关.dns的方法,有需要的朋友作个参考吧. 设置linux网络的方法有两种:第一种:使用命令修改(直接即时生效) 复制代码代码示例: ip and net ...
-
【括号问题】$(";li:lt("; + (idx + 1) + ";)";) 手风琴效果注意事项
$("li:lt(" + (idx + 1) + ")").each(function(i){ 注意,这里必须要加括号,是因为如果不加,idx与前面 &quo ...
-
python正则提取关键字
python使用正则表达式提取关键字 import sys reload(sys) sys.setdefaultencoding("utf-8") import re ss = & ...
-
MYSQL(Mariadb)
CentOS7下安装MariaDB 添加 MariaDB yum 仓库(官网的,也可以直接用aliyun云的) vi /etc/yum.repos.d/MariaDB.repo [mariadb] n ...
-
Java知识汇总——思维导图
转载:https://www.cnblogs.com/java1024/p/8757952.html Java知识点汇总,从基础到常用的API.还有常用的集合类,总结的很详细.图片是从论坛里面找到的, ...
-
Linux中断 - 驱动申请中断API
一.前言 本文主要的议题是作为一个普通的驱动工程师,在撰写自己负责的驱动的时候,如何向Linux Kernel中的中断子系统注册中断处理函数?为了理解注册中断的接口,必须了解一些中断线程化(threa ...
-
linux sed命令详解-乾颐堂CCIE
简介 sed 是一种在线编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的 ...