一:内省的概念

1:内省是反射的一种特例,由于在反射中频繁的操作javabean,所以为了方便反射

javabean,sun公司开发出一套API提高效率。

2:javaBean,就是用来封装客户端请求数据,有字段、get、set方法的对象,javaBean对象的属性有getXXX方法

决定。

二:内省访问JavaBean

1:定义javaBean

 public class Person {
private String name;
private int age; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public double getSalary() {
return 12000.0;
}
}

2:访问javaBean对象

a:获取所有的属性

 @Test
// 获取所有的属性
public void test1() throws Exception {
BeanInfo bi = Introspector.getBeanInfo(Person.class);
PropertyDescriptor[] pds = bi.getPropertyDescriptors();
for (PropertyDescriptor pd : pds) {
System.out.println(pd.getName());
}
}

运行结果:

age
class
name
salary

其中age ,name是定义的成员变量,salary是getSlary()方法定义的,class是因为Person继承了Object类,

所以也继承了Object的方法getClass();

要想得到自己定义的类,可以使用getBeanInfof(Person.class,Object.class)方法,如下:

 @Test
// 获取所有的属性
public void test1() throws Exception {
// BeanInfo bi = Introspector.getBeanInfo(Person.class);
BeanInfo bi = Introspector.getBeanInfo(Person.class, Object.class);
PropertyDescriptor[] pds = bi.getPropertyDescriptors();
for (PropertyDescriptor pd : pds) {
System.out.println(pd.getName());
}
}

运行结果:

age
name
salary

b:操作属性

 @Test
// 操作属性
public void test2() throws Exception {
Person p = new Person();
PropertyDescriptor pd = new PropertyDescriptor("age", Person.class);
// 获取getxxx()方法
Method m = pd.getWriteMethod();
m.invoke(p, 27);
// 获取setxxx()方法
m = pd.getReadMethod();
System.out.println(m.invoke(p, null));
}

c:获取当前属性的类型

 // 获取当前属性的类型
public void test3() throws Exception {
PropertyDescriptor pd = new PropertyDescriptor("age", Person.class);
System.out.println(pd.getPropertyType());
}

运行结果:

int

三:BeanUtils工具类的使用

beanUtils工具是apache基金会为了方便操作javaBean类,开发的一套API,在实际的开发中使用多于内省。

1:使用beanUtils设置属性的值

 @Test
// 使用beanutils设置属性
public void test01() throws Exception {
Person p = new Person();
BeanUtils.setProperty(p, "age", 27); // 设置age为27
System.out.println(p.getAge());
}

2:beanUtils内部有类型自动转换的机制,String类型可以转换为8种基本数据类型,如下:

 @Test
public void test02() throws Exception {
Person p = new Person();
String name = "Jack";
String age = "27";
BeanUtils.setProperty(p, "name", name);
BeanUtils.setProperty(p, "age", age); // 这里String类型转换为int类型
System.out.println(p.getName() + ":" + p.getAge());
}

本来Person类中age为int类型,但是String类型的age直接赋给了bean,但是转换仅限于8种基本数据类型。

3:如果是其他的类型,则转换会失败,如下Date类型,String转换是就会报错:

 @Test
public void test03() throws Exception {
Person p = new Person();
String name = "Jack";
String age = "27";
String birthday = "2010-10-02";
BeanUtils.setProperty(p, "name", name);
BeanUtils.setProperty(p, "age", age); // 这里String类型转换为int类型
BeanUtils.setProperty(p, "birthday", birthday); // 这里会报错,因为String类型自动转化仅限于8种基本类型
System.out.println(p.getName() + ":" + p.getAge() + ":"
+ p.getBirthday());
}

异常如下:

4:自定义String到Date的转化器

 @Test
public void test04() throws Exception {
Person p = new Person();
String name = "Jack";
String age = "27";
String birthday = "2010-10-02";
ConvertUtils.register(new Converter() { @Override
public Object convert(Class arg0, Object value) {
if (value == null) {
return null;
}
if (!(value instanceof String)) {
throw new ConversionException("转换异常!");
}
String str = (String) value;
if (str.trim().equals("")) {
return null;
}
// 排除以上情况,开始转换
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
return sdf.parse(str);
} catch (ParseException e) {
throw new RuntimeException(e);
}
} }, Date.class); // 将转换器里定义转换方法
BeanUtils.setProperty(p, "name", name);
BeanUtils.setProperty(p, "age", age); // 这里String类型转换为int类型
BeanUtils.setProperty(p, "birthday", birthday); // 这里会报错,因为String类型自动转化仅限于8种基本类型
System.out.println(p.getName() + ":" + p.getAge() + ":"
+ p.getBirthday());
}

转换成功!

5:使用BeanUtils定义的转化器

 @Test
public void test05() throws Exception {
Person p = new Person();
String name = "Jack";
String age = "27";
String birthday = "2010-10-02";
ConvertUtils.register(new DateLocaleConverter(), Date.class); // 将转换器里定义转换方法
BeanUtils.setProperty(p, "name", name);
BeanUtils.setProperty(p, "age", age); // 这里String类型转换为int类型
BeanUtils.setProperty(p, "birthday", birthday); // 这里会报错,因为String类型自动转化仅限于8种基本类型
System.out.println(p.getName() + ":" + p.getAge() + ":"
+ p.getBirthday());
}

但是这里有几个问题:

a:导包错误,导入java.util.Date,而不是java.sql.Date,否则报错,如下:

b:导入的commons-beanUtils.jar版本不对,建议commons-beanUtils-1.9.2.jar或者commons-beanUtils-1.9.2.jar都可以,

否则报错如下:

c:但是使用自定义的转换器有缺点,就是当日期字符串为空时,它不能判断,仍然后进行转换,异常如下:

但是自定义的转换器是没有这个问题的。

6:将map里存储的key-value封装到bean里面

 @Test
public void test06() throws Exception {
Person p = new Person();
Map<String, Object> map = new HashMap<String, Object>();
String name = "Jack";
String age = "27";
String birthday = "2010-10-02";
ConvertUtils.register(new DateLocaleConverter(), Date.class);
map.put("name", name);
map.put("age", age);
map.put("birthday", birthday);
BeanUtils.populate(p, map);
System.out.println(p.getName());
System.out.println(p.getAge());
System.out.println(p.getBirthday());
}

以上代码均已经验证!

javaweb学习总结五(内省、beanUtils工具包)的更多相关文章

  1. JavaWeb -- 内省—beanutils工具包 的使用

    Apache组织开发了一套用于操作JavaBean的API,这套API考虑到了很多实际开发中的应用场景,因此在实际开发中很多程序员使用这套API操作JavaBean,以简化程序代码的编写. Beanu ...

  2. javaweb学习总结(五)——Servlet开发(一)

    一.Servlet简介 Servlet是sun公司提供的一门用于开发动态web资源的技术. Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向 ...

  3. (转载)JavaWeb学习总结(五十)——文件上传和下载

    源地址:http://www.cnblogs.com/xdp-gacl/p/4200090.html 在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传 ...

  4. JavaWeb学习总结(五十)——文件上传和下载

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...

  5. 内省—beanutils工具包

    Apache组织开发了一套用于操作JavaBean的API,这套API考虑到了很多实际开发中的应用场景,因此在实际开发中很多程序员使用这套API操作JavaBean,以简化程序代码的编写. BeanU ...

  6. javaweb学习总结(五)——Servlet开发(一)(转)

    转载自 http://www.cnblogs.com/xdp-gacl/p/3760336.html 一.Servlet简介 Servlet是sun公司提供的一门用于开发动态web资源的技术. Sun ...

  7. JavaWeb学习笔记五 会话技术Cookie&Session

    什么是会话技术? 例如网站的购物系统,用户将购买的商品信息存储到哪里?因为Http协议是无状态的,也就是说每个客户访问服务器端资源时,服务器并不知道该客户端是谁,所以需要会话技术识别客户端的状态.会话 ...

  8. JavaWeb学习总结(五十二)——使用JavaMail创建邮件和发送邮件

    一.RFC882文档简单说明 RFC882文档规定了如何编写一封简单的邮件(纯文本邮件),一封简单的邮件包含邮件头和邮件体两个部分,邮件头和邮件体之间使用空行分隔. 邮件头包含的内容有: from字段 ...

  9. (转载)JavaWeb学习总结(五十三)——Web应用中使用JavaMail发送邮件

    博客源地址:http://www.cnblogs.com/xdp-gacl/p/4220190.html 现在很多的网站都提供有用户注册功能, 通常我们注册成功之后就会收到一封来自注册网站的邮件.邮件 ...

随机推荐

  1. linux 系统常用命令

    临时性的完全关闭防火墙,可以不重启机器: #/etc/init.d/iptables status                ##查看防火墙状态 #/etc/init.d/iptable stop ...

  2. ES6学习(2)——arrows箭头函数

    Arrows => 箭头函数 箭头函数,若有了解过coffeeScript的同学,或许对此印象深刻,因为它可以让语法省略不少,特别是对于回调函数,会让代码更清晰简洁. expression 让我 ...

  3. Unity3D之Mecanim动画系统学习笔记(三):Animation View

    动画组件之间的关系 我们先看一张图: 这里我们可以看到,我们在GameObject之上绑定的Animator组件是控制模型进行动画播放的. 而其属性Controller则对应一个Animator Co ...

  4. Thinkphp框架----微信公众测试号开发

    最开始的一个步骤.注册一个微信公众测试号.URL:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login; 接口配置的信息,对新手 ...

  5. Volley使用指南第三回(来自developer.android)

    继第二篇之后,再来Volley使用的教程的第三篇,有些翻译我是根据自己的理解,可能有错误的地方,还请多多包涵. 标准请求 这一回课将会告诉你Volley能够完成的3种请求类型 1.StringReqe ...

  6. Spring 3 整合Apache CXF WebService[转]

    http://www.cnblogs.com/hoojo/archive/2012/07/13/2590593.html 在CXF2版本中,整合Spring3发布CXF WebService就更加简单 ...

  7. EasyUI基础入门之Parser(解析器)

    前言 JQuery EasyUI提供的组件包含功能强大的DataGrid,TreeGrid.面板.下拉组合等.用户能够组合使用这些组件,也能够单独使用当中一个.(使用的形式是以插件的方式提供的) Ea ...

  8. hibernate+mysql 8小时问题

    在生产环境中使用了 自带的连接池 结果 遇到 mysql8小时问题 然后 采用了 c3p0 连接池 hibernate 版本 4.3.6 c3p0版本 0.9.5-pre10 ps:hibernate ...

  9. 【Winform】Winform 制作一键发布web

    前言 最近web网站有个需要,就是打包给客户,客户能够自己手动的进行傻瓜式的安装发布web.找了很多资料,其中涉及到 文件解压 IIS操作 数据库还原 等. 发现现在就主要是两种解决方案: ①:使用V ...

  10. 将Java程序作成exe文件的几种方法【转载】

    看到网上有同志的介绍将Java程序作成exe文件的方法,写的不错,但是也许是这篇文章完成的时间比较早,许多内容已经不合适了.我在这里补充几条: 一.exe4j 说明:exe4j可以将Jar文件制作成e ...