内省(Introspector)



内省(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)但凡遇到特定的类型转换时,就需要程序员自行编号类型转换器,该转换器一定要在设置代码之前执行才有效
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值