内省(二)

  上一篇内省(Introspector)讲到的是采用JavaAPI中的类来操作bean及其属性,而Apache也开源了第三方框架来简化和丰富了对bean属性的操作,这个框架就是BeanUtils。

使用BeanUtils记得先导入BeanUtils开发包,同时BeanUtils也需要将commons-logging一起导入,具体请看《配置BeanUtils包,同时也是对导入第三包的步骤说明》。

  如果我们要设置某个bean的属性,直接使用setProperty(Object bean, String name, Object value)方法即可,第一个参数为要设置的对象,第二个参数为属性名称,第三个参数为属性值。下面是对一个Person这个Bean对象的操作:

1     Person p = new Person();
2     BeanUtils.setProperty(p, "age", 25);
3     System.out.println(p.getAge());

输出:25

  可以看到这个比属性描述器(PropertyDiscreptor)要简单快捷。

  BeanUtils的功能不止这一点,它还能将字符串转换为基本数据类型。这点对于接收从表单来的数据(都是字符串)来说实在是太有用了,下面是一个简单的例子:

1     Person p = new Person();
2     BeanUtils.setProperty(p, "age", "25");
3     System.out.println(p.getAge());

  在这个例子中,Person的age属性类型为“int”,而在调用setProperty 时使用的属性值为字符串,因此BeanUtils就将字符串”25”转换为了整数型25值。

  最后再次声明,BeanUtils对于字符串的转换只支持八大基本数据类型!

  但是如果在Person中有一个Date类型的属性,简单的BeanUtils是无法做到使某个“1991-7-1”字符串能转换成Date类型的,那么都说了BeanUtils功能很强大,因此可以使用BeanUtils包中的ConvertUtils注册一个转换器,使得字符串能够转换成日期Date类型。

  要使用ConvertUtils注册转换器,只需调用register方法即可:

  从register方法中可以看出,第二个参数是要转换成的最终目标类型,第一个参数必须是一个Converter类的实例,而我们继续看这个Converter,发现是一个接口,并且在这个接口中只有一个convert方法,因此我们可以使用匿名内部类来实现这个接口,并在实现方法中处理将字符串转换为日期Date类型。

 1 Person p = new Person();
 2 ConvertUtils.register(new Converter() {
 3
 4     @Override
 5     public <T> T convert(Class<T> type, Object value) {
 6         if(value == null) {
 7             return null;
 8         }
 9         if(!(value instanceof String)) {
10             throw new ConversionException("传入类型错误");
11         }
12         String dateStr = (String) value;
13         if(dateStr.trim().equals("")) {
14             return null;
15         }
16
17         SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
18         try {
19             return (T)format.parse(dateStr);
20         } catch (ParseException e) {
21             throw new RuntimeException(e);
22         }
23     }
24
25 },Date.class);
26
27 BeanUtils.setProperty(p, "birthday", "1991-7-1");
28 System.out.println(p.getBirthday());

输出:

  

  当然上面我们使用的是自己来写这个接口,对于Apache的BeanUtils来说,Converter这个接口Apache已经帮我们写好了很多实现Converter接口的类了,因此我们可以使用这些现有的转换器类,比如有关日期的DateConverter或DateLocaleConverter。

  对上面的代码进行修改:

1   ConvertUtils.register(new DateLocaleConverter(), Date.class);
2
3   Person p = new Person();
4   BeanUtils.setProperty(p, "birthday", "1991-7-2");
5   System.out.println(p.getBirthday());

输出:

  

可以看到现有的转换器实现类能使我们的功能变得代码简洁。

  但是这样的转换器有时候并不能满足我们的需求,比如我们将日期字符串设置为空字符:

1   ConvertUtils.register(new DateLocaleConverter(), Date.class);
2
3   Person p = new Person();
4   BeanUtils.setProperty(p, "birthday", "");
5   System.out.println(p.getBirthday());

输出报错:

  

也就是这个转换器无法判断字符串为空的情况,直接抛出异常,健壮性不如自己写的转换器,当然有时候我们只需要有处理异常的情况也可以使用这个现有转换器,总之灵活应用。

  BeanUtils还能将Map集合中的值填充某个对象中的属性,只要Map集合的Key与属性名相同,这点非常适合web中的Request将数据封装到某个bean中。

 1   Map<String,String> map = new HashMap<>();
 2   map.put("name", "Ding");
 3   map.put("age", "25");
 4   map.put("birthday", "1991-7-1");
 5   ConvertUtils.register(new DateLocaleConverter(), Date.class);
 6   Person p = new Person();
 7
 8   BeanUtils.populate(p, map);
 9
10   System.out.println(p.getName());
11   System.out.println(p.getAge());
12   System.out.println(p.getBirthday());

输出:

  

最后再说一次,要使用populate方法,Map集合的key值必须要和对象中的属性名一致才行!

时间: 2024-10-07 17:28:53

内省(二)的相关文章

JAVAWEB开发之Session的追踪创建和销毁、JSP详解(指令,标签,内置对象,动作即转发和包含)、JavaBean及内省技术以及EL表达式获取内容的使用

Session的追踪技术 已知Session是利用cookie机制的服务器端技术,当客户端第一次访问资源时 如果调用request.getSession() 就会在服务器端创建一个由浏览器独享的session空间,并分配一个唯一且名称为JSESSIONID的cookie发送到浏览器端,如果浏览器没有禁用cookie的话,当浏览器再次访问项目中的Servlet程序时会将JSESSIONID带着,这时JSESSIONID就像唯一的一把钥匙  开启服务器端对应的session空间,进而获取到sessi

Python学习笔记总结(二)函数和模块

一.函数 函数的作用:可以计算出一个返回值,最大化代码重用,最小化代码冗余,流程的分解. 1.函数相关的语句和表达式 语句        例子 Calls        myfunc(‘diege','eggs',meat=‘lit’) #使用函数 def,return,yield      def adder(a,b=1,*c):                        return a+b+c[0] global        changer():                 gl

jsp 以及javabean内省技术

l JSP l JavaBean及内省 l EL表达式 1.1 上次课内容回顾 会话技术: Cookie:客户端技术.将数据保存在客户端浏览器上.Cookie是有大小和个数的限制. Session:服务器端技术.将数据保存在服务器端.Session没有大小和个数限制.Session基于Cookie回写了一个JSESSIONID. Cookie的分类: * 会话级别的Cookie:浏览器关闭了,Cookie就销毁了! * 持久化的Cookie: * cookie.setMaxAge(时间); --

javabean的内省技术和BeanUtils的使用

一.关于javabean javabean是固定写法的java类 书写格式为: 1)必须有无参构造函数 2)属性必须私有, 我们称为字段 3)提供标准的getter和setter 例: name 字段 的getter: String getName() settter: void setName(String name) javabean例子: //快捷键是shift+alt+s public class User { private String name; private int age;

Java核心_内省

Java核心_内省 查看java的api,发现有一个包java.bean咦,这个包是干什么的呢,原来,它是用来操作JavaBean对象的! 一.内省操作①JavaBean:一种特殊的Java类无参构造方法,每个属性提供getter和setter/Introspector/src/yuki/core/introspector/bean/Point.java package yuki.core.introspector.bean; public class Point { private int x

java内省机制

一.概念 内省(Introspector) 是Java 语言对 JavaBean 类属性.事件的一种缺省处理方法. JavaBean是一种特殊的类,主要用于传递数据信息,这种类中的方法主要用于访问私有的字段,且方法名符合某种命名规则.如果在两个模块之间传递信息,可以将信息封装进JavaBean中,这种对象称为“值对象”(Value Object),或“VO”.方法比较少.这些信息储存在类的私有变量中,通过set().get()获得.通俗地讲,每一对set/get方法都是对应的javaBean的一

java内省小记

//为了让程序员更好的操作javabean的属性,JDK提供了一套API用来访问某个属性的setter或getter方法.这就是内省 //内省(Introspector)是java语言对javabean类属性,方法和事件的一种标准处理方式. //内省访问javabean有两种方法. //设置javaBean属性值. public static void main(String[] args) throws Exception { //1.方式一 /*//实例化一个person对象 Person

黑马程序员—类加载、内省、注解、代理

--Java培训.Android培训.iOS培训..Net培训.期待与您交流! --- 一.类加载器 类加载器用于加载Java的字节代码到Java虚拟机中,同时将配置文件等放在classpath目录下. 类加载器读取Java字节码文件并转换成Java.lang.Class类的一个实例,通过该实例的newInstance()方法可以创建该类对象(相当于调用空参数的构造方法).基本上所有的类加载器都是 java.lang.ClassLoader类的一个实例. ClassLoader getParen

【Java EE 学习第23天】【log4j的使用】【ant的使用】【内省】

一.ant下载地址:http://ant.apache.org/bindownload.cgi  二.log4j下载地址:http://logging.apache.org/log4j/2.x/download.html 三.内省 1.什么是内省. 本质上是反射,具体技术由sun替公司提供,集成到了jdk中,可以根据字段名称(String)和字节码对象得到该字段的一个描述:PropertyDescriptor,并由此得到该字段的get.set方法(Method). 将要使用的JavaBean 1