总是感觉这部分有点云里雾里,现在重新整理笔记。
PropertyDescriptor第一眼并没有记住它,强行记忆!
package cn.heima;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
public class IntrospectorTest {
public static void main(String[] args) throws Exception{
ReflectPoint rp1 = new ReflectPoint(3,5);
String propertyName = "x";
//PropertyDescriptor 描述 Java Bean 通过一对存储器方法导出的一个属性。
PropertyDescriptor pd = new PropertyDescriptor(propertyName, rp1.getClass());
Method getX = pd.getReadMethod();
// 获得应该用于读取属性值的方法。
Object retVal = getX.invoke(rp1);
System.out.println(retVal);
Method setX = pd.getWriteMethod();
//获得应该用于写入属性值的方法。
setX.invoke(rp1, 9);
System.out.println(rp1.getX());
}
}
//采用遍历BeanInfo的所有属性方式来查找和设置某个ReflectPoint对象的
//x属性。在程序中把一个类当做JavaBean来看,就是调用Introspector.getBeanInfo()
//得到的BeanInfo对象封装了把这个类当做JavaBean看到的结果信息。
BeanInfo bi = Introspector.getBeanInfo(rp1.getClass());
PropertyDescriptor[] pds =bi.getPropertyDescriptors();
for(PropertyDescriptor pd1:pds){
if(pd1.getName().equals(propertyName))
{
System.out.println(pd1.toString());
System.out.println(pd1.getPropertyType());
Method getX1 = pd1.getReadMethod();
System.out.println("--"+getX1.invoke(rp1));
break;
}
}
System.out.println(BeanUtils.getProperty(rp1, "x").getClass().getName());
//BeanUtils操作参数需要的是字符串
BeanUtils.setProperty(rp1, "x", "110");
System.out.println(BeanUtils.getProperty(rp1, "x"));
//PropertyUtils操作的参数,是原定义的类型
System.out.println(PropertyUtils.getProperty(rp1, "x").getClass().getName());
PropertyUtils.setProperty(rp1, "x", 119);
System.out.println(PropertyUtils.getProperty(rp1, "x"));
/*java.lang.String
110
java.lang.Integer
119*/
//Date有个方法setTime 也是符合JavaBean的规则
//birthdat.time支持级联操作
BeanUtils.setProperty(rp1, "birthday.time", "120");
System.out.println(BeanUtils.getProperty(rp1, "birthday.time"));