内省(Introspector) — JavaBean
什么是JavaBean和字段/属性的读写方法?
访问JavaBean属性的两种方式:
1)直接调用bean的setXXX或getXXX方法。
2)通过内省技术访问(java.beans包提供了内省的API),内省技术访问也提供了两种方式:属性描述器类(PropertyDescriptor) 和内省类
注意:内省认为JavaBean的属性是与getXxx()有关的
1.1通过PropertyDescriptor类操作Bean的属性
通过Introspector类获得Bean对象的 BeanInfo,然后通过 BeanInfo 来获取属性的描述器( PropertyDescriptor ),通过这个属性描述器就可以获取某个属性对应的 getter/setter 方法,然后通过反射机制来调用这些方法
public void test1() throws Exception{
Student s = new Student();
PropertyDescriptor pd = new PropertyDescriptor("name",Student.class);
Method m = pd.getWriteMethod();
m.invoke(s,"jack"); //new Student().setName("jack")
m = pd.getReadMethod();
String name = (String)m.invoke(s,null); //new Student().getName()
System.out.println("name="+name);
}
1.2利用内省操作JavaBean的属性
public void test2() throws Exception{
BeanInfo bi = Introspector.getBeanInfo(Student.class);
PropertyDescriptor[] pds = bi.getPropertyDescriptors();
for(PropertyDescriptor pd : pds){
System.out.println(pd.getName());
}
}
1.3. 衍生出的框架------beanutils工具包
Apache组织开发了一套用于操作JavaBean的API,这套API考虑到了很多实际开发中的应用场景,因此在实际开发中很多程序员使用这套API操作JavaBean,以简化程序代码的编写。
Beanutils工具包的常用类:
BeanUtils、ConvertUtils.register(Converter convert, Class clazz)、自定义转换器 或 内置转换器
默认情况下将java.lang.String->java.util.Date类型会出错
注册类型转换器:register(Converter converter, java.util.Date.class)
类型转换器: Objectconvert(java.util.Date, java.lang.String)//查JDK API
自定义的类型转换器:
/*
//参数一:转换规则
//参数二:最终要转换成的类字节码对象
ConvertUtils.register(new Converter(){
//参数一:最终要转换成的类字节码对象,即java.util.Date.class
//参数二:用户输入的类型,即"2012-02-11"字符串
public Object convert(Class type, Object value) {
//将String转成java.util.Date类型
if(type!=null && type==java.util.Date.class){
if(value instanceof String){
try {
String strBirthday = (String)value;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
return sdf.parse(strBirthday);
} catch (ParseException e) {
e.printStackTrace();
}
}
}
return null;
}
},java.util.Date.class);
*/
利用框架操作JavaBean的属性
ConvertUtils.register(new DateLocaleConverter(),Date.class);//
Student s = new Student();
BeanUtils bu = new BeanUtils();
bu.setProperty(s, "name", "jack");
bu.setProperty(s, "age", “31");
bu.setProperty(s, "birthday", "1980-7-23");
System.out.println(bu.getProperty(s, "name"));
System.out.println(bu.getProperty(s, "age"));
System.out.println(bu.getProperty(s, "birthday"));
时间转换:
格林威治-->本地时区
Calendar c = Calendar.getInstance();
c.setTime(person.getBirthday());
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH) + 1;
int date = c.get(Calendar.DATE);
总结:
1 什么是JavaBean?有何特征?
1)侠义JavaBean:
》公共的构造方法
》私有的字段
》对每个私有的字段提供公共的存取方法
2)广义JavaBean:
》公共的构造方法
》私有的字段
》对每个私有的字段提供公共的存取方法
》N个业务方法
3)存取方法:setUsername()和getUsername()
2 内省API(SUN公司开发)
1)站在反射的角度去操作JavaBean的属性,即存和取
2)属性和如下特性有关:
>>跟getXxxx()有关
>>getXxxx()有返回值
>>每一个JavaBean都会有一个class属性,该属性来自于object
*3 BeanUtils工具(APACHE开源组织开发)
1)BeanUtils工具也具有与内省一至的功能
2)减化了内省操作JavaBean的开发步骤
3)还具有8种基本类型与String之间的自动转化
4)但凡遇到特定的类型转换时,就需要程序员自行编号类型转换器,该转换器一定要在设置代码之前执行才有效