所谓内省,就是用反射的方法获取或设置某个对象的属性,这个对象一定要有get和set方法才可以。这种含get和set方法的类称为又JavaBean。
内省的方法有很多,下面举例说明:
String propertyName = "name";
Student student = new Student("pengyuding",22);
Student student = new Student("pengyuding",22);
怎样获取student对象的“name”里的属性?(已知Student类含有String name和int age属性,且有相应的set和get方法)
1.用属性名拼凑出get方法,然后用反射获取并调用这个方法
(这里省略,重点介绍下面的方法)
2.用属性描述类PropertyDescriptor获取get方法,然后调用。
PropertyDescriptor pd = new PropertyDescriptor(propertyName, student.getClass());//得到student中“name”属性的PropertyDescriptor。
Method method = pd.getReadMethod();//用属性描述来获取get方法,同理也可以获取set方法。
Object retVal2 = method.invoke(student);//调用这个方法
Method method = pd.getReadMethod();//用属性描述来获取get方法,同理也可以获取set方法。
Object retVal2 = method.invoke(student);//调用这个方法
System.out.println("第二种方法获取的结果:"+retVal2);
3.用Introspector类的静态方法getBeanInfo获取JavaBean的信息,然后得到该类的属性描述,再用2方法。
BeanInfo beanInfo = Introspector.getBeanInfo(student.getClass());//得到Student类的BeanInfo对象,BeanInfo里面装了把这个类当做JavaBean看的信息。
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();//用BeanInfo对象得到属性描述(PropertyDescriptor)对象的集合(这里只能得到所有的属性描述)
Object retVal2= null;
for(PropertyDescriptor pd : pds)
{
if(pd.getName().equals(propertyName))//遍历这个集合,得到名字为“name”的属性,并按照方法2得到方法并调用。
{
Method method = pd.getReadMethod();
retVal2= method.invoke(student);
break;
}
}
System.out.println("第三种方法获取的结果:"+retVal2);
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();//用BeanInfo对象得到属性描述(PropertyDescriptor)对象的集合(这里只能得到所有的属性描述)
Object retVal2= null;
for(PropertyDescriptor pd : pds)
{
if(pd.getName().equals(propertyName))//遍历这个集合,得到名字为“name”的属性,并按照方法2得到方法并调用。
{
Method method = pd.getReadMethod();
retVal2= method.invoke(student);
break;
}
}
4.用工具包Beanutils
System.out.println(BeanUtils.getProperty(student, "name"));
BeanUtils.setProperty(student, "age", "9");//这里9用了字符串
BeanUtils.setProperty(student, "age", "9");//这里9用了字符串
System.out.println(student.getAge());
PropertyUtils.setProperty(student, "age", 4);//这里4用原本的类型
System.out.println(student.getAge());
使用这个工具之前必须导入这个工具的jar包。它提供了两个重要的静态工具类BeanUtils和PropertyUtils。
他们都有setProperty方法,区别就是BeanUtils无论接收参数还是返回参数都是用String型的,而PropertyUtils处理的是属性本来的类型。
getProperty也是如此。
----------------------android培训、java培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net/heima