反射内省JaveBean与简单工厂设计模式(七)

2014-11-24 09:39:54 · 作者: · 浏览: 4
fd.setPos(0);
rfd.setSize(3);
ArrayList al = new ArrayList();
al.add("abc");
al.add("bcd");
rfd.setAlist(al);

propertyDescriptorDemo(rfd);
//beanInfo无法一次的得到某一个属性的PropertyDescriptor。
//BeanInfo需要通过Introspector来获取
beanInfoDemo(rfd);
beanUtilsDemo(rfd);
}

private static void beanUtilsDemo(ReflectDemo rfd) {
String name = null;
PropertyDescriptor pd = null ;
try{
//通过BeanUtils的getProperty方法,获得属性的值
name = BeanUtils.getProperty(rfd, "name");
System.out.println(name);
//通过BeanUtils的setProperty方法,获得属性的值
BeanUtils.setProperty(rfd, "name", "wangwu");
System.out.println(rfd.getName());
//通过BeanUtils反射,若属性是List集合则只能得到集合中的第一个元素
name = BeanUtils.getProperty(rfd, "alist");
System.out.println(name);

//但Collection等集合中的元素可以通过getArrayPropertys来获取元素中每个值
String[] names = BeanUtils.getArrayProperty(rfd, "alist");
System.out.println("------alist-------::"+Arrays.toString(names));

//用PropertyDescriptor来拿属性的值
pd = new PropertyDescriptor("alist",rfd.getClass());
Class propClazz = pd.getPropertyType();
System.out.println("属性的类型为::"+propClazz.getName());

Method readMethod = pd.getReadMethod();
Object obj = readMethod.invoke(rfd);
System.out.println(obj.getClass().isArray()); //false,不是数组
ArrayList alist = (ArrayList)obj;
System.out.println(alist);

System.out.println("----------------隔开,下面测试用Map的方式来玩转BeanUtils---------------");
Map map = new HashMap();
map.put("size", 88);
map.put("age", 28);

//BeanUtils可以直接操作Map对象,来获取其中的键值对呢
String sizeStr = BeanUtils.getProperty(map, "size");
String ageStr = BeanUtils.getProperty(map, "age");
System.out.println("[size="+sizeStr+",age="+ageStr+"]");
//还有个相似的类就是PropertyUtils,它与BeanUtils的区别是,getProperty返回的是属性的实际类型,
//setProperty时,也就将实现类型值传下其中,而不像BeanUtils都是字符串,返回的是字符串,set设置时也是字符串。
Integer age = (Integer)PropertyUtils.getProperty(map, "age");
System.out.println(age);

}catch(Exception e){
e.printStackTrace();
}
}

private static void beanInfoDemo(ReflectDemo rfd) {
BeanInfo bi = null;
String propName = "name";
try {
bi = Introspector.getBeanInfo(rfd.getClass());
PropertyDescriptor[] pds = bi.getPropertyDescriptors();
for(PropertyDescriptor pd:pds){
if(propName.equals(pd.getName())){
System.out.println("beaninfo得到PropertyDescriptors数组后,再迭代PropertyDescriptor,得到name的值::"+pd.getReadMethod().invoke(rfd));
}
}

} catch (Exception e) {
e.printStackTrace();
}


}

private stati