为什么要学内省?

开发框架时,经常需要使用java对象的属性来封装程序的数据,每次都使用反射技术完成此类操作过于麻烦,所以sun公司开发了一套API,专门用于操作java对象的属性。

内省是用于操作java对象的属性的,那么以下问题我们必须要清楚。

问题一: 什么是Java对象的属性和属性的读写方法?

问题二: 如何通过内省访问到javaBean的属性 ?

1. 通过PropertyDescriptor类操作Bean的属性.

public static void testPropertyDescriptor() throws Exception{
Person p = new Person();
PropertyDescriptor propertyDescriptor = new PropertyDescriptor("id",Person.class);
//获取属性的写的方法。
Method writeMethod = propertyDescriptor.getWriteMethod();
Method readMethod = propertyDescriptor.getReadMethod();
propertyDescriptor.getReadMethod();
writeMethod.invoke(p, 12);
System.out.println(readMethod.invoke(p, null));
}

2. 通过Introspector类获得Bean对象的 BeanInfo,然后通过 BeanInfo 来获取属性的描述器( PropertyDescriptor ),通过这个属性描述器就可以获取某个属性对应的 getter/setter 方法,然后通过反射机制来调用这些方法。

 public static void testIntrospector() throws Exception{
BeanInfo beanInfo = Introspector.getBeanInfo(Person.class);
PropertyDescriptor[] descriptor = beanInfo.getPropertyDescriptors();
for(PropertyDescriptor itemProperty : descriptor){
System.out.println(itemProperty.getReadMethod().getName());
}
}

存在的问题: sun公司的内省API过于繁琐,所以Apache组织结合很多实际开发中的应用场景开发了一套简单、易用的API操作Bean的属性——BeanUtils。

 public static void main(String[] args) throws Exception {
Person p = new Person();
ConvertUtils.register(new Converter() { @Override
public Object convert(Class type, Object value) {
try {
if(value!=null){ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy MM dd");
Date d = dateFormat.parse((String) value);
return d;
}
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} return null;
}
}, Date.class); BeanUtils.setProperty(p,"id","110");
BeanUtils.setProperty(p,"name","狗娃");
BeanUtils.setProperty(p, "birthDay","1992 12 12");
System.out.println(p.getId() +"=="+ p.getName()+"======"+p.getBirthDay());
}

BeanUtils:

BeanUtils主要解决 的问题: 把对象的属性数据封装 到对象中。

BeanUtils的好处:
1. BeanUtils设置属性值的时候,如果属性是基本数据 类型,BeanUtils会自动帮我转换数据类型。
2. BeanUtils设置属性值的时候底层也是依赖于get或者Set方法设置以及获取属性值的。
3. BeanUtils设置属性值,如果设置的属性是其他的引用 类型数据,那么这时候必须要注册一个类型转换器。

BeanUtilss使用的步骤:
1. 导包commons-logging.jar 、 commons-beanutils-1.8.0.jar

 public class Demo3 {

     public static void main(String[] args) throws Exception {
//从文件中读取到的数据都是字符串的数据,或者是表单提交的数据获取到的时候也是字符串的数据。
String id ="110";
String name="陈其";
String salary = "1000.0";
String birthday = "2013-12-10"; //注册一个类型转换器
ConvertUtils.register(new Converter() { @Override
public Object convert(Class type, Object value) { // type : 目前所遇到的数据类型。 value :目前参数的值。
Date date = null;
try{
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
date = dateFormat.parse((String)value);
}catch(Exception e){
e.printStackTrace();
}
return date;
} }, Date.class); Emp e = new Emp();
BeanUtils.setProperty(e, "id", id);
BeanUtils.setProperty(e, "name",name);
BeanUtils.setProperty(e, "salary",salary);
BeanUtils.setProperty(e, "birthday",birthday); System.out.println(e); } }

最新文章

  1. c#读取INI文件
  2. linux执行sh脚本文件命令
  3. js基础之面向对象
  4. FineUI PK DWZ
  5. C++学习笔记(十五):异常
  6. iOS9升级后第三方平台无法分享的问题
  7. 游戏基础元素——Cocos2d-x学习历程(八)
  8. Fancytree Javascript Tree TreeTable 树介绍和使用
  9. C# 程序修改config文件后,不重启程序刷新配置ConfigurationManager
  10. 滚动ListView时图像顺序混乱
  11. 线段树合并 || 树状数组 || 离散化 || BZOJ 4756: [Usaco2017 Jan]Promotion Counting || Luogu P3605 [USACO17JAN]Promotion Counting晋升者计数
  12. Unity3D MonoBehaviour的生命周期(lifecycle)
  13. button的OnClickListener的三种实现方法
  14. java 设计模式大全
  15. 【转载】3D/2D中的D3DXMatrixPerspectiveFovLH和D3DXMatrixOrthoLH投影函数详解
  16. 《JavaWeb从入门到改行》那些年一起学习的Servlet
  17. LeetCode:N叉树的前序遍历【589】
  18. 再看Scrapy(1) 基本概念
  19. Service和IntentService的区别
  20. React-Native Listview组件用法详解

热门文章

  1. tps 与 事务平均响应时间关系对答(转)
  2. EasyPlayerPro Windows流媒体播放器(RTSP/RTMP/HTTP/HLS/File/TCP/RTP/UDP都能播)发布啦
  3. 前端mvc组合框架
  4. 2017-2018-1 20179209《Linux内核原理与分析》第七周作业
  5. 项目发布之后 总提示有一个.DLL找不到或不匹配
  6. 迁移博客到Github Pages
  7. zkeacms源码解读一
  8. Cocos2d-x中定时器的使用
  9. fiddler篡改请求数据
  10. MySQL_杭州拱墅区、西湖区近9-11月销售过的产品_20161125