国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

關(guān)于Bean

2019-11-14 21:39:45
字體:
供稿:網(wǎng)友
關(guān)于Bean什么是Bean?

一個Bean 就是一個類。我們不必為制造任何的Bean而編寫一些特殊的代碼或者使用特殊的編程語言。事實上,我們唯一需要做的是略微地修改我們對我們方法命名的辦法。方法名通知應(yīng)用程序構(gòu)建工具是否是一個屬性,一個事件或是一個普通的方法。

java 的文件中,命名規(guī)則被錯誤地曲解為“設(shè)計范式”。這十分的不幸,因為設(shè)計范式惹來不少的麻煩。命名規(guī)則不是設(shè)計范式,它是相當(dāng)?shù)暮唵危?/p>

(1) 因為屬性被命名為xxx,我們代表性的創(chuàng)建兩個方法:getXxx()和setXxx()。注意get 或set 后的第一個字母大寫以產(chǎn)生屬性名。“get”和“set”方法產(chǎn)生同樣類型的自變量。“set”和“get”的屬性名和類型名之間沒有關(guān)系。

(2) 對于布爾邏輯型屬性,我們可以使用上面的“get”和“set”方法,但我們也可以用“is”代替“ get”。

(3) Bean 的普通方法不適合上面的命名規(guī)則,但它們是公用的。

(4) 對于事件,我們使用“listener(接收器)”方法。這種方法完全同我們看到過的方法相同:

(addFooBarListener(FooBarListener)和removeFooBarListener(FooBarListener)方法用來處理FooBar 事件。大多數(shù)時候內(nèi)建的事件和接收器會滿足我們的需要,但我們可以創(chuàng)建自己的事件和接收器接口。

上面的第一點回答了一個關(guān)于我們可能注意到的從Java 1.0 到Java 1.1 的改變的問題:一些方法的名字太過于短小,顯然改寫名字毫無意義。現(xiàn)在我們可以看到為了制造Bean 中的特殊的組件,大多數(shù)的這些修改不得不適合于“get”和“set”命名規(guī)則。

Bean代碼示例:

 1 //: Frog.java 2 // A trivial Java Bean 3 package frogbean; 4 import java.awt.*; 5 import java.awt.event.*; 6 class Spots {} 7 public class Frog { 8 PRivate int jumps; 9 private Color color;10 private Spots spots;11 private boolean jmpr;12 public int getJumps() { return jumps; }13 public void setJumps(int newJumps) {14 jumps = newJumps;15 }16 public Color getColor() { return color; }17 public void setColor(Color newColor) {18 color = newColor;19 }20 public Spots getSpots() { return spots; }21 public void setSpots(Spots newSpots) {22 spots = newSpots;23 }24 public boolean isJumper() { return jmpr; }25 public void setJumper(boolean j) { jmpr = j; }26 public void addActionListener(27 ActionListener l) {28 //...29 }30 public void removeActionListener(31 ActionListener l) {32 // ...33 }34 public void addKeyListener(KeyListener l) {35 // ...36 }37 public void removeKeyListener(KeyListener l) {38 // ...39 }40 // An "ordinary" public method:41 public void croak() {42 System.out.println("Ribbet!");43 }44 } //
View Code

首先,我們可看到Bean 就是一個類。通常,所有我們的字段會被作為專用,并且可以接近的唯一辦法是通過方法。緊接著的是命名規(guī)則,屬性是jump,color,jumper,spots(注意這些修改是在第一個字母在屬性名的情況下進(jìn)行的)。雖然內(nèi)部確定的名字同最早的三個例子的屬性名一樣,在jumper 中我們可以看到屬性名不會強迫我們使用任何特殊的內(nèi)部可變的名字(或者,真的擁有一些內(nèi)部的可變的屬性名)。Bean 事件的句柄是ActionEvent 和KeyEvent ,這是根據(jù)有關(guān)接收器的“add”和“remove”命名方法得出的。最后我們可以注意到普通的方法croak()一直是Bean 的一部分,僅僅是因為它是一個公共的方法,而不是因為它符合一些命名規(guī)則。

用I n t r o s p e c t o r 提取B e a n I n f o
  1 //: BeanDumper.java  2   3 // A method to introspect a Bean  4   5 import java.beans.*;  6   7 import java.lang.reflect.*;  8   9 public class BeanDumper { 10  11 public static void dump(Class bean){ 12  13 BeanInfo bi = null; 14  15 try { 16  17 bi = Introspector.getBeanInfo( 18  19 bean, java.lang.Object.class); 20  21 } catch(IntrospectionException ex) { 22  23 System.out.println("Couldn't introspect " + 24  25 bean.getName()); 26  27 System.exit(1); 28  29 } 30  31 PropertyDescriptor[] properties = 32  33 bi.getPropertyDescriptors(); 34  35 for(int i = 0; i < properties.length; i++) { 36  37 Class p = properties[i].getPropertyType(); 38  39 System.out.println( 40  41 "Property type:/n " + p.getName()); 42  43 System.out.println( 44  45 "Property name:/n " + 46  47 properties[i].getName()); 48  49 Method readMethod = 50  51 properties[i].getReadMethod(); 52  53 if(readMethod != null) 54  55 System.out.println( 56  57 "Read method:/n " + 58  59 readMethod.toString()); 60  61 Method writeMethod = 62  63 properties[i].getWriteMethod(); 64  65 if(writeMethod != null) 66  67 System.out.println( 68  69 "Write method:/n " + 70  71 writeMethod.toString()); 72  73 System.out.println("===================="); 74  75 } 76  77 System. out.println("Public methods:"); 78  79 MethodDescriptor[] methods = 80  81 bi.getMethodDescriptors(); 82  83 for(int i = 0; i < methods.length; i++) 84  85 System.out.println( 86  87 methods[i].getMethod().toString()); 88  89 System.out.println("======================"); 90  91 System.out.println("Event support:"); 92  93 EventSetDescriptor[] events = 94  95 bi.getEventSetDescriptors(); 96  97 for(int i = 0; i < events.length; i++) { 98  99 System.out.println("Listener type:/n " +100 101 events[i].getListenerType().getName());102 103 Method[] lm =104 105 events[i].getListenerMethods();106 107 for(int j = 0; j < lm.length; j++)108 109 System.out.println(110 111 "Listener method:/n " +112 113 lm[j].getName());114 115 MethodDescriptor[] lmd =116 117 events[i].getListenerMethodDescriptors();118 119 for(int j = 0; j < lmd.length; j++)120 121 System.out.println(122 123 "Method descriptor:/n " +124 125 lmd[j].getMethod().toString());126 127 Method addListener =128 129 events[i].getAddListenerMethod();130 131 System.out.println(132 133 "Add Listener Method:/n " +134 135 addListener.toString());136 137 Method removeListener =138 139 events[i].getRemoveListenerMethod();140 141 System.out.println(142 143 "Remove Listener Method:/n " +144 145 removeListener.toString());146 147 System.out.println("====================");148 149 }150 151 }152 153 // Dump the class of your choice:154 155 public static void main(String[] args) {156 157 if(args.length < 1) {158 159 System.err.println("usage: /n" +160 161 "BeanDumper fully.qualified.class");162 163 System.exit(0);164 165 }166 167 Class c = null;168 169 try {170 171 c = Class.forName(args[0]);172 173 } catch(ClassNotFoundException ex) {174 175 System.err.println(176 177 "Couldn't find " + args[0]);178 179 System.exit(0);180 181 }182 183 dump(c);184 185 }186 187 } ///:
View Code

  

BeanDumper.dump()是一個可以做任何工作的方法。首先它試圖創(chuàng)建一個BeanInfo 對象,如果成功地調(diào)用BeanInfo 的方法,就產(chǎn)生關(guān)于屬性、方法和事件的信息。在Introspector.getBeanInfo()中,我們會注意到有一個另外的自變量。由它來通知Introspector 訪問繼承體系的地點。在這種情況下,它在分析所有對象方法前停下,因為我們對看到那些并不感興趣。因為屬性,getPropertyDescriptors()返回一組的屬性描述符號。對于每個描述符號我們可以調(diào)用getPropertyType()方法徹底的通過屬性方法發(fā)現(xiàn)類的對象。這時,我們可以用getName()方法得到每個屬性的假名(從方法名中提取),getname()方法用getReadMethod()和getWriteMethod()完成讀和寫的操作。最后的兩個方法返回一個可以真正地用來調(diào)用在對象上調(diào)用相應(yīng)的方法方法對象(這是映象的一部分)。對于公共方法getMethodDescriptors( )返回一組方法描述字符。每一個我們都可以得到相當(dāng)?shù)姆椒▽ο蟛⒖梢燥@示出它們的名字。對于事件而言,getEventSetDescriptors()返回一組事件描述字符。它們中的每一個都可以被查詢以找出接

收器的類,接收器類的方法以及增加和刪除接收器的方法。BeanDumper 程序打印出所有的這些信息。

如果我們調(diào)用BeanDumper 在Frog 類中,就像這樣:

java BeanDumper frogbean.Frog

它的輸出結(jié)果如下(已刪除這兒不需要的額外細(xì)節(jié)):

  1 class name: Frog  2   3 Property type:  4   5 Color  6   7 Property name:  8   9 color 10  11 Read method: 12  13 public Color getColor() 14  15 Write method: 16  17 public void setColor(Color) 18  19 ==================== 20  21 Property type: 22  23 Spots 24  25 Property name: 26  27 spots 28  29 Read method: 30  31 public Spots getSpots() 32  33 Write method: 34  35 public void setSpots(Spots) 36  37 ==================== 38  39 Property type: 40  41 boolean 42  43 Property name: 44  45 jumper 46  47 Read method: 48  49 public boolean isJumper() 50  51 Write method: 52  53 public void setJumper(boolean) 54  55 ==================== 56  57 Property type: 58  59 int 60  61 Property name: 62  63 jumps 64  65 Read method: 66  67 public int getJumps() 68  69 Write method: 70  71 public void setJumps(int) 72  73 ==================== 74  75 Public methods: 76  77 public void setJumps(int) 78  79 public void croak() 80  81 public void removeActionListener(ActionListener) 82  83 public void addActionListener(ActionListener) 84  85 public int getJumps() 86  87 public void setColor(Color) 88  89 public void setSpots(Spots) 90  91 public void setJumper(boolean) 92  93 public boolean isJumper() 94  95 public void addKeyListener(KeyListener) 96  97 public Color getColor() 98  99 public void removeKeyListener(KeyListener)100 101 public Spots getSpots()102 103 ======================104 105 Event support:106 107 Listener type:108 109 KeyListener110 111 Listener method:112 113 keyTyped114 115 Listener method:116 117 keyPressed118 119 Listener method:120 121 keyReleased122 123 Method descriptor:124 125 public void keyTyped(KeyEvent)126 127 Method descriptor:128 129 public void keyPressed(KeyEvent)130 131 Method descriptor:132 133 public void keyReleased(KeyEvent)134 135 Add Listener Method:136 137 public void addKeyListener(KeyListener)138 139 Remove Listener Method:140 141 public void removeKeyListener(KeyListener)142 143 ====================144 145 Listener type:146 147 ActionListener148 149 Listener method:150 151 actionPerformed152 153 Method descriptor:154 155 public void actionPerformed(ActionEvent)156 157 Add Listener Method:158 159 public void addActionListener(ActionListener)160 161 Remove Listener Method:162 163 public void removeActionListener(ActionListener)164 165 ====================
View Code

這個結(jié)果揭示出了Introspector 在從我們的Bean 產(chǎn)生一個BeanInfo 對象時看到的大部分內(nèi)容。我們可注意到屬性的類型和它們的名字是相互獨立的。請注意小寫的屬性名。(當(dāng)屬性名開頭在一行中有超過不止的大寫字母,這一次程序就不會被執(zhí)行。)并且請記住我們在這里所見到的方法名(例如讀和與方法)真正地從一個可以被用來在對象中調(diào)用相關(guān)方法的方法對象中產(chǎn)生。通用方法列表包含了不相關(guān)的事件或者屬性,例如croak()。列表中所有的方法都是我們可以有計劃的為Bean 調(diào)用,并且應(yīng)用程序構(gòu)建工具可以選擇列出所有的方法,當(dāng)我們調(diào)用方法時,減輕我們的任務(wù)。最后,我們可以看到事件在接收器中完全地分析研究它的方法、增加和減少接收器的方法。基本上,一旦我們擁有BeanInfo ,我們就可以找出對Bean 來說任何重要的事物。我們同樣可以為Bean 調(diào)用方法,即使我們除了對象外沒有任何其它的信息(此外,這也是映象的特點)。

參考書:《Java編程思想第四版》


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 广昌县| 盐源县| 武邑县| 集贤县| 莲花县| 云梦县| 中卫市| 五莲县| 博湖县| 新绛县| 临西县| 棋牌| 和田县| 阿拉善左旗| 郁南县| 玛纳斯县| 永善县| 江口县| 枝江市| 沾益县| 泰和县| 大宁县| 叶城县| 北碚区| 石楼县| 灯塔市| 博罗县| 唐海县| 齐河县| 庆阳市| 涞源县| 肃宁县| 衡水市| 高陵县| 合江县| 新巴尔虎左旗| 昌邑市| 旅游| 乌兰浩特市| 沙坪坝区| 东港市|