电竞比分网-中国电竞赛事及体育赛事平台

分享

如何獲取Java類中的變量名的字串 - 軟件人生,雕刻時光 - JavaEye技術(shù)網(wǎng)站

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

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

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

現(xiàn)提供一個可以動態(tài)獲取對象中的變量的變量名稱的方法:

public class MyTools {
    public static void setAllComponentsName(Object f) {
        // 獲取f對象對應(yīng)類中的所有屬性域
        Field[] fields = f.getClass().getDeclaredFields();
        for(int i = 0 , len = fields.length; i < len; i++) {
            // 對于每個屬性,獲取屬性名
            String varName = fields[i].getName();
            try {
                // 獲取原來的訪問控制權(quán)限
                boolean accessFlag = fields[i].isAccessible();
                // 修改訪問控制權(quán)限
                fields[i].setAccessible(true);
                // 獲取在對象f中屬性fields[i]對應(yīng)的對象中的變量
                Object o = fields[i].get(f);
                System.out.println("傳入的對象中包含一個如下的變量:" + varName +  " = " + o);
                // 恢復(fù)訪問控制權(quán)限
                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);這句主要是因為私有的變量在對象外是無法訪問的,通過這個設(shè)置就可以改變私有變量的訪問權(quán),還真的有點恐怖,當(dāng)偶把這個解決方法告訴Boss的時候,Boss差點吐血,私有的都能訪問了,還有什么安全可言?

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

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

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

傳入的對象中包含一個如下的變量: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

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多