内省(introspector)------>JavaBean
1、问什么要学内省? 开发框架时,经常需要Java对象的属性来来封装程序的数据,每次使用反射技术完成此操作过于麻烦,所以SUN 公司开发了一套API,专门操作Java对象的属性 2、什么是JavaBean和属性的读写方法? 3、通过内省技术访问(Java.beans包提供了内省的API)JavaBean的两张方式 贱人 小婊砸 矫情 &、通过introspector类获取Bean对象的BeanInfo,然后通过BeanInfo来获取属性的描述器(PropertyDescriptor) 通过这个属性器,就可以获取某个属性对应getter和setter方法,然后通过反射机制来调用这些方法 &、通过PropertyDescriptor类操作Bean的属性-------------------------------------------------private String name="mumu";//字段 private int age;//字段 private Date birthdy; public String getName(){//属性指的是设置获取setter和读写getter的字段的方法 return name; } public Date getBirthdy() { return birthdy; } public void setBirthdy(Date birthdy) { this.birthdy = birthdy; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getAbc(){//属性:属性的名称是abc return "abc"; }------------------------------------------------- 一、内省:操作属性的(类中的getter和setter方法) 得到student类属,封装到BeanInfo中 BeanInfo bean = Introspector.getBeanInfo(Student.class); 得到类中的所有属性描述器 PropertyDescriptor[] pd = bean.getPropertyDescriptors(); system.out.println(pd.length);//打印出来Student类中属性的长度 for(PropertyDescriptor p:pd){//属性:属性的名称是abc system.out.println(p.getName());//打印出属性name的值 } 二、// PropertyDescriptor(String propertyName, Class<?> beanClass) // 通过调用 getFoo 和 setFoo 存取方法,为符合标准 Java 约定的属性构造一个 PropertyDescriptor。 //创建student对象 Student s = new Student(); //得到类中的属性描述器 PropertyDescriptor p = new PropertyDescriptor("name",Student.class);//name为属性的名称,Student.class为student的字节码 Method m = p.getReadMethod();//得到getName()的方法 //得到的是string类型的值 String str = (String)m.invoke(s,null);//s:为那个对象的;null:表示传入的值,次返回的是Object的值,请转换成String类型的值 sysotem.out.println(str); //设置属性的值 Method me = p.getWriteMethod();//得到setName()的值 me.invoke(s,"xiaomumu"); system.out.println(s.getName()); 三、//利用BeanUtils框架来操作属性 //创建student对象 Student s= new Student(); //调用getName()方法 String str = BeanUtils.getProperty(s,"name");//s:表示为那个对象的,"name":表示为对象中名称为“name”属性的方法 sysotem.out.pritnln(str); //设置name属性的值 BeansUtils.setProperty(s,"name",value);s:表示为那个对象的,"name":表示为对象中名称为“name”属性的方法,value:表示所输入的值 system.out.println(s.getName());//打印修改后:属性名称为name的值 四、//BeanUtils可以进行类型的自动装换,但仅限于基本类型之间,如:需要int类型的,输入String类型的也可以 //创建student对象 Student s = new Student(); String str = BeanUtils.getProperty(s,"age");//得到getAge()方法 system.out.println(str); //设置age属性的值 BeanUtils.setProperty(s,"age","12");//设置age字段的值为字符串,beanUtils可以进行自动的转换 system.out.println(s.getAge()); 五、//对于非基本类型的设置 //用户输入的都是字符类型 //String <---------->和其他类型之间的互相装换 //用户看到的都是string类型的 Student s = new Student(); //给BeanUtils注册类型装换器 //new DateLocaleConverter():转化成本地类型 ConvertUtils.register(new converter(){//匿名内部类实现内部类 register:注册类型转换器,给什么类型,转换成想要得到的类型 //type:目标类型,也就是想要转换成的类型 //value:当前传入的值 public Object convert(Class type, Objcet value){} // if(value.equals(Date.class)){ // //字符串转换成Date类型 // }else{ // //Date转换成字符串类型 // } DateFormat df = new simpleDateFormat("yyyy-MM-dd"); //传入String的值 if(value instanceof String){//instanceof:实类化对象 //字符串数据类型转换成Date数据类型 String str = (String)value; try{ Date dt = df.prase();//把字符串类型的数据解析成Date类型 return dt; }cache(Exception e){ throw new RuntimeException(e); } }else{ //Date数据类型转换成String类型 Date d = (Date)value; String str=df.format(d); return s; } BeanUtils.setProperty(s,"birthdy","3002-03-03"); system.out.println(s.getBirthdy()); },Date.class); 六、//利用BeanUtils封装数据 Map map = new HashMap(); map.put("name","xiaomumu"); map.put("age",18); map.put("birthdy","2001-01-01"); Person p = new Person(); //封装数据前 System.out.println("封装数据前:"+p); CovertUtils.register(new DateLocaleConverter(),Date.class); BeanUtils.populate(p,map); System.out.println("封装数据后:"+p);