java中的内省
為了讓程式員們更好的操作java對象的屬性,sun公司開發了一套api,被業界内稱為:内省;内省的出現有利于對類對象屬性的操作,減少了代碼的數量。下面用一個小例子來印證一下。
我有一個javabean(關于javabean後面會介紹)類introspector,裡面有一個私有的x屬性,現在要得到這個x屬性的值。如果我們用反射來做的話,首先你要将x字元轉為大寫的x,然後用字元串拼接成getx,然後你要用反射得到introspector類的class,再得到類的所有公有方法,循環比較方法找出getx方法的method對象,然後用method對象的invoke方法得到x屬性的值。這樣做還是比較麻煩的。如果用内省來做就會比較簡單了,方法如下:
introspector is1 = new introspector();
//propertyname:屬性名,is1.getclass():包含屬性名對象的class(與反射相關)propertydescriptor不明白的可以看jdk幫助文檔
propertydescriptor pd = new propertydescriptor(propertyname,is1.getclass());
method methodgetx = pd.getreadmethod();
object getval1 = methodgetx.invoke(is1);//此時的getval1就是屬性x的值
//也可以設定屬性的值
method methodsetx = pd.getwritemethod();
methodsetx.invoke(is1,3);
内省通路javabean有兩種方法:
一、通過introspector類獲得bean對象的beaninfo,然後通過beaninfo來擷取屬性的描述器( propertydescriptor ),通過這個屬性描述器就可以擷取某個屬性對應的 getter/setter 方法,然後通過反射機制來調用這些方法。(這種方法要麻煩一些)
二、通過propertydescriptor來操作bean對象。(這種方法要簡單得多)
接下來要對student 類對象進行操作,student類源碼如下:
public class student {
private string name;//字段
public string getxxx(){//讀方法
return "xx";
}
public string setxxx(){//寫方法
public string getname() {
return name;
public void setname(string name) {
this.name = name;
}
首先、是第一種方式,源碼如下:
public void test() throws exception{
student student = new student();
//1.通過introspector來擷取bean對象的beaninfo
beaninfo bif = introspector.getbeaninfo(student.class);
//2.通過beaninfo來獲得屬性描述器(propertydescriptor)
propertydescriptor pds[] = bif.getpropertydescriptors();
//3.通過屬性描述器來獲得對應的get/set方法
for(propertydescriptor pd:pds){
//4.獲得并輸出字段的名字
system.out.println(pd.getname());
//5.獲得并輸出字段的類型
system.out.println(pd.getpropertytype());
if(pd.getname().equals("name")){
//6.獲得propertydescriptor對象的寫方法
method md = pd.getwritemethod();
//7.執行寫方法
md.invoke(student, "lou_wazor");
}
}
//8.輸出所指派字段的值
system.out.println(student.getname());
}
執行結果為:
class
class java.lang.class
name
class java.lang.string
xxx
lou_wazor
以下是通過第二種方法來操作bean對象,源碼如下:
public void test01()throws exception{
student st = new student();
//1.通過構造器來建立propertydescriptor對象
propertydescriptor pd = new propertydescriptor("name", student.class);
//2.通過該對象來獲得寫方法
method method = pd.getwritemethod();
//3.執行寫方法
method.invoke(st, "lou_wazor");
//4.輸出對象字段的值
system.out.println(st.getname());
//5.通過對象獲得讀方法
method = pd.getreadmethod();
//6.執行讀方法并定義變量接受其傳回值并強制塑形
string name = (string) method.invoke(st, null);
//7.輸出塑形後的值
system.out.println(name);
lou_wazor
java中的javabean
一、javabean是什麼?
javabean 是一種java語言寫成的可重用元件。為寫成javabean,類必須是具體的和公共的,并且具有無參數的構造器。javabean是一種特殊的java類,主要用于傳遞資料資訊,這種java類中的方法主要用于通路私有的字段,且方法名符合某種命名規則。javabean可分為兩種:一種是有使用者界面(ui,user interface)的javabean;還有一種是沒有使用者界面,主要負責處理事務(如資料運算,操縱資料庫)的javabean。jsp通常通路的是後一種javabean。
/**
* 一個簡單的javabean
* @author json
*
*/
public class javabean {
/**
* 不寫構造函數方法預設提供無參的構造函數方法,如果寫了一個有參的構造函數方法,那 就有一個有參的構造函數方法,預設的無參構造函數方法就沒有了----這是類的構
* 造方法的小知識與javabean沒有什麼關系的
*/
// public javabean(){
//
// }
//私有屬性
private int x;
private string y;
* 得到屬性值
* @return
public int getx() {
return x;
}
* 設定屬性值
* @param x
public void setx(int x) {
this.x = x;
public string gety() {
return y;
public void sety(string y) {
this.y = y;
二、用javabean的地方
如果要在兩個子產品之間傳遞多個資訊,可以将這些資訊封裝到一個javabean中,這種javabean的執行個體對象通常稱為值對象(value object, vo),這些資訊在類中用私有 字段來存儲。javabean的屬性是根據其中的setter和getter方法來确定的,而不是根據其中的成員變量.如果方法名為setid,中文意思就是設定id,至于你把它存到哪個變量上,不用考慮。如果方法名為getid,中文意思就是得到id,至于你從哪個變量上取,不用考慮。去掉set字首,剩餘部分就是屬性名,如果屬性的第二個字母是小寫的,那首字母小寫,屬性的第二個字母是大寫的,首字母大寫,大寫是為了好看。
三、使用javabean要注意的地方
1.不要試圖在javabean傳回的html中放置任何字型尺寸。------并不是所有的浏覽器都相同。很多浏覽器無法處理完整的字型尺寸。
3.不要提供任何的選擇。-----------如果使用者使用不同的系統浏覽頁面,可以提供一種可以替換的方法。(關于這點我是不了解的)
四、javabean的特點
1. 可以實作代碼的重複利用
2. 易編寫、易維護、易使用
3. 可以在任何安裝了java運作環境的平台上的使用,而不需要重新編譯。
五、javabean遵守的規則
編寫javabean就是編寫一個java的類,是以你隻要會寫類就能編寫一個bean,這個類建立的一個對象稱做一個bean。為了能讓使用這個bean的應用程式建構工具(比如jsp引擎)知道這個bean的屬性和方法,隻需在類的方法命名上遵守以下規則:
getxxx(),用來擷取屬性xxx。
setxxx(),用來修改屬性xxx.。
2. 對于boolean類型的成員變量,即布爾邏輯類型的屬性,允許使用"is"代替上面的"get"和"set"。
3. 類中通路屬性的方法都必須是public的,一般屬性是private的。
4. 類中如果有構造方法,那麼這個構造方法也是public的并且是無參數的。
關于javabean的更多詳細可以去這裡看http://baike.baidu.com/link?url=ufk07rhyopk7w34el9wnqca-uw1gtlpg1ledwwuosdxhxrpafgh-wiivwkfpiqfv