如何遍歷一個實例的所有屬性,得到屬性的名稱和值

http://chengxuyuan.blog.sohu.com/148074810.html


如何遍歷一個實例的所有屬性,得到屬性的名稱和值

  Type   t   =   this.GetType();  
  MethodInfo   mii   =   t.GetProperty("a").GetGetMethod();  
  Console.WriteLine(mii.Invoke(this,null));

利用反射。  
  static   void   Main(string[]   args)  
  {  
  MoneyHome.Class.DataOperate   d   =   new   MoneyHome.Class.DataOperate();//實例  
  Type   t   =   d.GetType();  
  MessageBox.Show(t.Namespace,"DataOperate類的命名空間");  
  MessageBox.Show(t.IsClass.ToString(),"DataOperae是不是一個類");  
  MemberInfo[]   m   =   t.GetMembers();  
  StringBuilder   st   =   new   StringBuilder(800);  
  foreach(MemberInfo   m1   in   m)  
  {  
  st.Append("Members:     ");  
  st.Append(m1.ToString());  
  st.Append("\n");  
  }

  Type   t   =   this.GetType();  
  PropertyInfo[]   arrpf=   t.GetProperties();  
  foreach(PropertyInfo   p   in   arrpf)  
  {  
  // MethodInfo   mii   =   t.GetProperty(p.Name).GetGetMethod();  
  // Console.WriteLine(mii.Invoke(this,null));  
  Console.WriteLine(p.GetValue(this,null).ToString());  
  }Top

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();
 }

在類中定義了一個屬性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


發佈了35 篇原創文章 · 獲贊 5 · 訪問量 34萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章