30 对JavaBean的简单内省操作
//pt1为javaBean对象,propertyName为要设置的属性,value为给javaBean的值
private static void setProperties(Object pt1, String propertyName,
Object value) throws IntrospectionException,
IllegalAccessException, InvocationTargetException {
PropertyDescriptor pd = new PropertyDescriptor(propertyName,pt1.getClass());
Method methodSetX = pd.getWriteMethod();
methodSetX.invoke(pt1, value);
}
//pt1为javaBean对象,propertyName为要获取的属性
private static Object getProperty(Object pt1, String propertyName)
throws IntrospectionException, IllegalAccessException,
InvocationTargetException {
PropertyDescriptor pd=new PropertyDescriptor(propertyName, pt1.getClass());
Method methodGetX=pd.getReadMethod();
Object retVal=methodGetX.invoke(pt1);//因为不知道返回的是什么类型,所以用Object
return retVal;
}
31 对JavaBean的复杂内省操作
l 演示用eclipse自动生成 ReflectPoint类的setter和getter方法。
l 直接new一个PropertyDescriptor对象的方式来让大家了解JavaBean API的价值,先用一段代码读取JavaBean的属性,然后再用一段代码设置JavaBean的属性。
l 演示用eclipse将读取属性和设置属性的流水帐代码分别抽取成方法:
Ø 只要调用这个方法,并给这个方法传递了一个对象、属性名和设置值,它就能完成属性修改的功能。
Ø 得到BeanInfo最好采用“obj.getClass()”方式,而不要采用“类名.class”方式,这样程序更通用。
l 采用遍历BeanInfo的所有属性方式来查找和设置某个RefectPoint对象的x属性。在程序中把一个类当作JavaBean来看,就是调用IntroSpector.getBeanInfo方法, 得到的BeanInfo对象封装了把这个类当作JavaBean看的结果信息。
private static Object getProperty(Object pt1, String propertyName)throws Exception {
/*PropertyDescriptor pd=new PropertyDescriptor(propertyName, pt1.getClass());
Method methodGetX=pd.getReadMethod();
Object retVal=methodGetX.invoke(pt1);//因为不知道返回的是什么类型,所以用Object
*/
BeanInfo beanInfo = Introspector.getBeanInfo(pt1.getClass());
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
Object retVal = null;
for(PropertyDescriptor pd : pds){
if(pd.getName().equals(propertyName))
{
Method methodGetX = pd.getReadMethod();
retVal = methodGetX.invoke(pt1);
break;
}
}
return retVal;
}