程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 用java類中的映射獲取變量名

用java類中的映射獲取變量名

編輯:關於JAVA

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

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

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

現提供一個可以動態獲取對象中的變量的變量名稱的bt方法:

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved