2012-04-09 52 views
1

我對Java相當陌生,遇到了問題。我的任務是創建一個包含方法write(Object obj)的類,該方法將對象的類型以及所有屬性的名稱和類型寫入文件中。因爲對象可能有對象/對象數組作爲屬性,所以涉及遞歸。Java中的數組的反射

下面是代碼:

public void write(Object obj) throws Exception { 

    if(obj == null) 
    { 
     out.close(); 
     return; 
    } 

    Class c = obj.getClass(); 
    Class d; 
    Field fields_c[] = c.getDeclaredFields(); 
    System.out.println("class_name:" + c.getName()); 

    int i, j; 
    String tab = new String(""); 


    for(i = 0; i < indent_level; i++) 
    { 
     tab = tab + "\t"; 
    } 

    out.write(tab + "class_name:" + c.getName() + "\n"); 

    for(i = 0; i < fields_c.length; i++) { 
     System.out.println("field name: " + fields_c[i].getName() + " "); 

     c = fields_c[i].getType(); 
     fields_c[i].setAccessible(true); 

     if(c.isPrimitive()) { 
      out.write("\t" + tab + "field_name:" + c.toString() + "\n"); 
     } 
     else if(c.isArray()) { 
      System.out.println("field of type array with elements of type:" + c.getComponentType()); 

      for(j = 0; j < Array.getLength(c); j++) 
      { 
       d = Array.get(c, j).getClass(); 
       indent_level = indent_level + 1; 
       this.write(d); 
       indent_level = indent_level - 1;    
      } 
     } 
     else 
     { 
      System.out.println("field is not primitive of type:" + c.getName()); 
      Object foo = fields_c[i].get(obj); 
      indent_level = indent_level + 1; 
      this.write(foo); 
      indent_level = indent_level - 1; 
     } 
    } 
} 

例外,如果出現我調用該方法並給出具有一個數組屬性的對象;所有的屬性,直到數組正確寫入輸出文件。 異常是「java.lang.IllegalArgumentException:參數不是數組」。

+0

你有大量的不良編碼實踐。爲什麼有人會給你任務來處理一些相當抽象的東西(訪問類和字段,然後再分析它們),如果你對java_沒有什麼新意的話?例如,你可以通過賦值來初始化一個字符串。我認爲拋出異常是因爲C當時不是數組,而是一個字段。嘗試將其轉換爲數組...但idk如何。你正在打擾抽象的東西,這是非常沒用的IMO。 – MarioDS 2012-04-09 21:53:32

+0

我認爲你在代碼中混合了一些東西。你只想打印屬性名稱和類型,還是要包含值?如果您只需要名稱和類型,則不需要遞歸,而且您不必遍歷數組的元素。 – Sandro 2012-04-09 22:12:38

+0

我還沒有從我自己的意願中挑選此作業...... – Sebi 2012-04-09 22:12:43

回答

1

d = Array.get(c, j).getClass();c的類型爲java.lang.Class,但需要一個數組。

您應該將其更改爲d = Array.get(fields_c[i].get(obj), j)並使用c#getComponentType獲取數組的類型。

+0

如果c.isArray()被證明是正確的,我只接受這個分支。或者有我必須製作的演員。 – Sebi 2012-04-09 21:55:09

+0

需要演員。如果在調用之前驗證它是一個數組,那麼jvm不知道對象實際是什麼,除了Object。 – 2012-04-09 21:56:03

+0

'c'類型'Class'爲'Field#getType'返回'Class'。 'isArray'是類'Class'的方法。 – Sandro 2012-04-09 21:58:57

0

這可能不是你以前的樣子,但如果這是做序列化,那麼我建議「簡單」;

http://simple.sourceforge.net/

這使得Java < => XML序列化令人難以置信的容易。

+0

更簡單:[XStream](http://xstream.codehaus.org) – Sandro 2012-04-09 21:57:20

0

爲什麼要傳遞類元素,而不是元素:

 Object[] array = fields_c[i].get(obj); 
     for(j = 0; j < Array.getLength(array); j++) 
     { 
      Object foo = Array.get(array, j); // not .getClass() 
      indent_level = indent_level + 1; 
      this.write(foo); 
      indent_level = indent_level - 1;    
     }