總是感覺這部分有點雲裏霧裏,現在重新整理筆記。
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"));