|
JAVABEAN是一個遵循特定寫法的java類,它通常具有如下特點: 1.這個java類必須具有一個無參構造函數(shù) 2.屬性必須私有化 3.私有化的屬性必須通過public類型的方法暴露給其他程序,并且方法的命名也必須遵守一定的命名規(guī)范 JAVABEAN屬性:
一、定義: 把一個擁有對屬性進行set和get方法的類,我們就可以稱之為JavaBean。實際上JavaBean就是一個java類,在這個java類中就默認形成了一種規(guī)則——對屬性進行設置和獲得。而反之將說ava類就是一個JavaBean,這種說法是錯誤的,因為一個java類中不一定有對屬性的設置和獲得的方法(也就是不一定有set和get方法)。 二、從JavaBean中就引出了一個內省的概念 內?。喊岩活愔行枰M行設置和獲得的屬性訪問權限設置為private(私有的)讓外部的使用者看不見摸不著,而通過public(共有的)set和get方法來對其屬性的值來進行設置和獲得,而內部的操作具體是怎樣的?外界使用的人不用不知道,這就稱為內省。 三,這里有一個面試題,分享一下 存在一個JavaBean,它包含以下幾種可能的屬性: 1:boolean/Boolean 2:int/Integer 3:String 4:double/Double 屬性名未知,現(xiàn)在要給這些屬性設置默認值,以下是要求的默認值: String類型的默認值為字符串 www.itheima.com int/Integer類型的默認值為100 boolean/Boolean類型的默認值為true double/Double的默認值為0.01D. 只需要設置帶有getXxx/isXxx/setXxx方法的屬性,非JavaBean屬性不設置,請用代碼實現(xiàn) /* 設計思路: 設計一個模擬題目要求的JavaBean類,通過反射進行對其中的未知屬性名的變量賦值。 1,拿到字節(jié)碼文件,建立一個空構造函數(shù)的實例對象。 2,利用字節(jié)碼作為參數(shù),Introspector.getBeanInfo(JavaBean.class)得到BeanInfo實例對象。 3,通過BeanInfo的方法,beanInfo.getPropertyDescriptors()拿到該字節(jié)碼的所有屬性描述。 3,通過PropertyDescriptor--屬性描述實例對象,通過調用getWriteMethod()方法,修改字節(jié)碼中屬性的值。 4,在通過屬性描述中getPropertyType()方法,定位是那種類型的成員變量,篩選出后,進行相應的修改賦值。 */ 這里是源碼分享一下 package com.itheima; import java.beans.BeanInfo; import java.beans.Introspector; import java.beans.PropertyDescriptor; import java.lang.reflect.Method; /* * 5、 存在一個JavaBean,它包含以下幾種可能的屬性: 1:boolean/Boolean 2:int/Integer 3:String 4:double/Double 屬性名未知,現(xiàn)在要給這些屬性設置默認值,以下是要求的默認值: String類型的默認值為字符串 www.itheima.com int/Integer類型的默認值為100 boolean/Boolean類型的默認值為true double/Double的默認值為0.01D. 只需要設置帶有getXxx/isXxx/setXxx方法的屬性,非JavaBean屬性不設置,請用代碼實現(xiàn) */ /* * 設計思路: 設計一個模擬題目要求的JavaBean類,通過反射進行對其中的未知屬性名的變量賦值。 1,拿到字節(jié)碼文件,建立一個空構造函數(shù)的實例對象。 2,利用字節(jié)碼作為參數(shù),Introspector.getBeanInfo(JavaBean.class)得到BeanInfo實例對象。 3,通過BeanInfo的方法,beanInfo.getPropertyDescriptors()拿到該字節(jié)碼的所有屬性描述。 3,通過PropertyDescriptor--屬性描述實例對象,通過調用getWriteMethod()方法,修改字節(jié)碼中屬性的值。 4,在通過屬性描述中getPropertyType()方法,定位是那種類型的成員變量,篩選出后,進行相應的修改賦值。 */
//建立模擬JavaBean類 class JavaBean{ //成員變量 private boolean flag; private int number; private String itcast; private double money;
//成員變量相應的set和get方法 public void setItcast(String newitcast){ itcast=newitcast; } public String getItcast(){ return itcast; }
public void setNumber(int newnumber){ number=newnumber; } public int getNumber(){ return number; }
public void setFlag(boolean newflag){ flag=newflag; } public boolean getFlag(){ return flag; }
public void setMoney(double newmoney){ money=newmoney; } public double getMoney(){ return money; } } public class HeiMa{ public static void main(String[] args) throws Exception { //拿到字節(jié)碼 Class<JavaBean> clazz=JavaBean.class; //拿到字節(jié)碼的一個對象實例 Object obj=clazz.newInstance(); //通過字節(jié)碼拿到BeanInfo實例對象 BeanInfo beanInfo=Introspector.getBeanInfo(clazz); //通過BeanInfo拿到這個字節(jié)碼的所有屬性描述 PropertyDescriptor[] pds=beanInfo.getPropertyDescriptors(); //通過屬性描述對象拿到屬性對應的set方法和get方法,通過set方法進行屬性賦值 for(PropertyDescriptor pd:pds){ //拿到當前屬性的set方法 Method setMethod=pd.getWriteMethod(); Method getMethod=pd.getReadMethod();
//拿到當前屬性的類型字節(jié)碼 Class<?> properclass=pd.getPropertyType(); //通過字節(jié)碼來篩選出相應的屬性,再對應賦值,賦值完畢后,通過打印get方法查看賦值情況。 if(properclass==String.class){ setMethod.invoke(obj, "www.itheima.com"); System.out.println(getMethod.invoke(obj)); }else if(properclass==int.class || properclass==Integer.class){ setMethod.invoke(obj, 100); System.out.println(getMethod.invoke(obj)); }else if(properclass==Boolean.class || properclass==boolean.class){ setMethod.invoke(obj, true); System.out.println(getMethod.invoke(obj)); }else if(properclass==Double.class || properclass==double.class){ setMethod.invoke(obj, 0.01D); System.out.println(getMethod.invoke(obj)); }
} } } |
|
|