如何擷取java類中的變數名的字串

來源:互聯網
上載者:User

http://daimojingdeyu.blogbus.com/logs/5185456.html

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

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

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

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

 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

 

隨機文章:

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.