zhongli

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            3 Posts :: 0 Stories :: 0 Comments :: 0 Trackbacks

          在類中定義了一個屬性abc,如何獲取這個變量的abc的名字串呢?也就是說怎么知道abc這個變量的名字是abc,這個問題比較的好玩。

          這個是偶在一開發中遇到的一個比較有趣的問題,找 了半天的資料加下偶辛勤的思考,終于找到的解決方法。用反射~~~

          java提供了很強大的反射機制,可以說比動態語言還動態。但是這個東東平時的應用不是很多的說。

          現提供一個可以動態獲取對象中的變量的變量名稱的bt方法:
          甜性澀愛h動漫下載小說520網 
          public class MyTools {
              public static void setAllComponentsName(Object f) {
                  // 獲取f對象對應類中的所有屬性域
                  Field[] fields = f.getClass().getDeclaredFields();
                  for(int i = 0 , len = fields.length; i < len; i++) {
                      // 對于每個屬性,獲取屬性名
                      String varName = fields[i].getName();
                      try {
                          // 獲取原來的訪問控制權限
                          boolean accessFlag = fields[i].isAccessible();
                          // 修改訪問控制權限
                          fields[i].setAccessible(true);
                          // 獲取在對象f中屬性fields[i]對應的對象中的變量
                          Object o = fields[i].get(f);
                          System.out.println("傳入的對象中包含一個如下的變量:" + varName +  " = " + o);
                          // 恢復訪問控制權限
                          fields[i].setAccessible(accessFlag);
                      } catch (IllegalArgumentException ex) {
                          ex.printStackTrace();
                      } catch (IllegalAccessException ex) {
                          ex.printStackTrace();
                      }
                  }
              }

              public static void main(String[] args)
              {
                      //  測試代碼用來獲取一個JLabel中聲名的所有的屬性名和其屬性變量
                      setAllComponentsName(new JLabel("測試"));
              }
           }

           fields[i].setAccessible(true);這句主要是因為私有的變量在對象外是無法訪問的,通過這個設置就可以改變私有變量的訪問權,還真的有點恐怖,當偶把這個解決方法告訴Boss的時候,Boss差點吐血,私有的都能訪問了,還有什么安全可言?

          不過了,有安全就有特權,所以由于能很好的解決問題還是被采納了,嘻嘻~~~

          Object o = fields[i].get(f);這句的作用就是取得傳入對象f中類的屬性fields[i]對應的真實的屬性變量,說的有點別扭,比如有一個類A中有一個int abc的屬性,并且我們有兩個A類的對象a1,a2,那么當我們用fields[i].get(a1)的時候得到的將是對象a1中的具體的abc屬性,而我們用fields[i].get(a2)的時候得到的將是對象a2中的具體的abc屬性。

          最后是用一個main方法測試了一個JLabel對象,打印出了JLabel中聲名的所有的變量名,并輸出了其對應的變量的值。結果如下:

          傳入的對象中包含一個如下的變量:uiClassID = LabelUI
          傳入的對象中包含一個如下的變量:mnemonic = 0
          傳入的對象中包含一個如下的變量:mnemonicIndex = -1
          傳入的對象中包含一個如下的變量:text = 測試
          傳入的對象中包含一個如下的變量:defaultIcon = null
          傳入的對象中包含一個如下的變量:disabledIcon = null
          傳入的對象中包含一個如下的變量:disabledIconSet = false
          傳入的對象中包含一個如下的變量:verticalAlignment = 0
          傳入的對象中包含一個如下的變量:horizontalAlignment = 10
          傳入的對象中包含一個如下的變量:verticalTextPosition = 0
          傳入的對象中包含一個如下的變量:horizontalTextPosition = 11
          傳入的對象中包含一個如下的變量:iconTextGap = 4
          傳入的對象中包含一個如下的變量:labelFor = null
          傳入的對象中包含一個如下的變量:LABELED_BY_PROPERTY = labeledBy

          posted on 2009-02-13 12:53 zhongli 閱讀(4588) 評論(0)  編輯  收藏
          主站蜘蛛池模板: 西平县| 高平市| 正阳县| 五峰| 广西| 宁化县| 潞城市| 隆子县| 西华县| 达尔| 蓝山县| 西乌| 开封市| 民勤县| 河津市| 上林县| 台东县| 达拉特旗| 东阿县| 金沙县| 谢通门县| 沙田区| 鄂温| 芒康县| 仁布县| 云安县| 石狮市| 望都县| 临洮县| 和政县| 射洪县| 汾西县| 甘泉县| 莆田市| 革吉县| 丹阳市| 新邵县| 河间市| 肥西县| 鹿邑县| 冷水江市|