------- android培训、java培训、期待与您交流! ----------
想弄清内省就先要知道JavaBean
JavaBean 是一种JAVA语言写成的可重用组件。为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器。JavaBean 通过提供符合一致性设计模式的公共方法将内部域暴露成员属性。
为什么要学内省?
开发框架时,经常需要使用java对象的属性来封装程序的数据,每次都使用反射技术完成此类操作过于麻烦,所以sun公司开发了一套API,专门用于操作java对象的属性。
什么是Java对象的属性和属性的读写方法?
内省访问JavaBean属性的两种方式:
通过PropertyDescriptor类操作Bean的属性
通过Introspector类获得Bean对象的 BeanInfo,然后通过 BeanInfo 来获取属性的描述器( PropertyDescriptor ),通过这个属性描述器就可以获取某个属性对应的 getter/setter 方法,然后通过反射机制来调用这些方法。
内省—beanutils工具包
Sun公司的内省API过于繁琐,所以Apache组织结合很多实际开发中的应用场景开发了一套简单、易用的API操作Bean的属性——BeanUtils,也是开源的。
public void test() throws Exception{
Student stu=new Student();
BeanInfo beanInfo=Introspector.getBeanInfo(Student.class);
PropertyDescriptor pds[]= beanInfo.getPropertyDescriptors();
for(PropertyDescriptor pd:pds){
System.out.println(pd.getName());
System.out.println(pd.getShortDescription());
System.out.println(pd.getDisplayName());
if(pd.equals("age")){
Method md=pd.getWriteMethod();
md.invoke(stu, 122);
}
}
System.out.println(stu.getAge());
}
通过Introspector类获得Bean对象的 BeanInfo,然后通过 BeanInfo 来获取属性的描述器(PropertyDescriptor )通过这个属性描述器就可以获取某个属性对应的 getter/setter 方法,
然后通过反射机制来调用这些方法。
public void test() throws Exception {
Student st = new Student();
// 1、通过Introspector类获得Bean对象的 BeanInfo,
BeanInfo beanInfo= Introspector.getBeanInfo(Student.class);
// 2、然后通过 BeanInfo 来获取属性的描述器( PropertyDescriptor )
PropertyDescriptor pdrs[] = beanInfo.getPropertyDescriptors();
// 3、通过这个属性描述器就可以获取某个属性对应的 getter/setter 方法,
for (PropertyDescriptor pd : pdrs) {
System.out.println(pd.getName());
System.out.println(pd.getShortDescription());
System.out.println(pd.getDisplayName());
if (pd.getName().equals("age")) { //age是什么类型?
Method md = pd.getWriteMethod();
md.invoke(st, 12);
}
//获取属性的类型
System.out.println(pd.getName()+""+pd.getPropertyType());
}
//获取属性age
System.out.println(st.getAge());
}
//简便的方法
public void test1()throws Exception{
Student st = new Student();
//通过构造器创建 PropertyDescriptor对象
PropertyDescriptor pd = new PropertyDescriptor("age",Student.class);
Method md = pd.getWriteMethod(); //写操作
md.invoke(st, 120);
System.out.println(st.getAge());
md = pd.getReadMethod();
int value = (Integer)md.invoke(st, null); //读操作
System.out.println(value);
}
来看看更方便的操作吧
public void test1()throws Exception{
Student st = new Student();
BeanUtils.setProperty(st , "age", 120);
Object age = BeanUtils.getProperty(p, "age")
System.out.println(age);
}
掌握了以上的内容,以后碰上框架需要取用数据的时候就可以轻松的驾驭了。