在類中定義了一個(gè)屬性abc,如何獲取這個(gè)變量的abc的名字串呢?也就是說怎么知道abc這個(gè)變量的名字是abc,這個(gè)問題比較的好玩。
這個(gè)是偶以前在一開發(fā)中遇到的一個(gè)比較有趣的問題,找了半天的資料加下偶辛勤的思考,終于找到的解決方法。用反射~~~
java提供了很強(qiáng)大的反射機(jī)制,可以說比動(dòng)態(tài)語(yǔ)言還動(dòng)態(tài)。但是這個(gè)東東平時(shí)的應(yīng)用不是很多的說。
現(xiàn)提供一個(gè)可以動(dòng)態(tài)獲取對(duì)象中的變量的變量名稱的方法:
public class MyTools {
public static void setAllComponentsName(Object f) {
// 獲取f對(duì)象對(duì)應(yīng)類中的所有屬性域
Field[] fields = f.getClass().getDeclaredFields();
for(int i = 0 , len = fields.length; i < len; i++) {
// 對(duì)于每個(gè)屬性,獲取屬性名
String varName = fields[i].getName();
try {
// 獲取原來的訪問控制權(quán)限
boolean accessFlag = fields[i].isAccessible();
// 修改訪問控制權(quán)限
fields[i].setAccessible(true);
// 獲取在對(duì)象f中屬性fields[i]對(duì)應(yīng)的對(duì)象中的變量
Object o = fields[i].get(f);
System.out.println("傳入的對(duì)象中包含一個(gè)如下的變量:" + 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)
{
// 測(cè)試代碼用來獲取一個(gè)JLabel中聲名的所有的屬性名和其屬性變量
setAllComponentsName(new JLabel("測(cè)試"));
}
}
fields[i].setAccessible(true);這句主要是因?yàn)樗接械淖兞吭趯?duì)象外是無法訪問的,通過這個(gè)設(shè)置就可以改變私有變量的訪問權(quán),還真的有點(diǎn)恐怖,當(dāng)偶把這個(gè)解決方法告訴Boss的時(shí)候,Boss差點(diǎn)吐血,私有的都能訪問了,還有什么安全可言?
不過了,有安全就有特權(quán),所以由于能很好的解決問題還是被采納了,嘻嘻~~~
Object o =fields[i].get(f);這句的作用就是取得傳入對(duì)象f中類的屬性fields[i]對(duì)應(yīng)的真實(shí)的屬性變量,說的有點(diǎn)別扭,比如有一個(gè)類A中有一個(gè)intabc的屬性,并且我們有兩個(gè)A類的對(duì)象a1,a2,那么當(dāng)我們用fields[i].get(a1)的時(shí)候得到的將是對(duì)象a1中的具體的abc屬性,而我們用fields[i].get(a2)的時(shí)候得到的將是對(duì)象a2中的具體的abc屬性。
最后是用一個(gè)main方法測(cè)試了一個(gè)JLabel對(duì)象,打印出了JLabel中聲名的所有的變量名,并輸出了其對(duì)應(yīng)的變量的值。結(jié)果如下:
傳入的對(duì)象中包含一個(gè)如下的變量:uiClassID = LabelUI
傳入的對(duì)象中包含一個(gè)如下的變量:mnemonic = 0
傳入的對(duì)象中包含一個(gè)如下的變量:mnemonicIndex = -1
傳入的對(duì)象中包含一個(gè)如下的變量:text = 測(cè)試
傳入的對(duì)象中包含一個(gè)如下的變量:defaultIcon = null
傳入的對(duì)象中包含一個(gè)如下的變量:disabledIcon = null
傳入的對(duì)象中包含一個(gè)如下的變量:disabledIconSet = false
傳入的對(duì)象中包含一個(gè)如下的變量:verticalAlignment = 0
傳入的對(duì)象中包含一個(gè)如下的變量:horizontalAlignment = 10
傳入的對(duì)象中包含一個(gè)如下的變量:verticalTextPosition = 0
傳入的對(duì)象中包含一個(gè)如下的變量:horizontalTextPosition = 11
傳入的對(duì)象中包含一個(gè)如下的變量:iconTextGap = 4
傳入的對(duì)象中包含一個(gè)如下的變量:labelFor = null
傳入的對(duì)象中包含一個(gè)如下的變量:LABELED_BY_PROPERTY = labeledBy
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)
點(diǎn)擊舉報(bào)。