2012-01-30 68 views
0

以前我寫過一個應用程序,它使用反射來將數據從json序列化到對象,並且該解決方案工作正常。現在我正在研究這個應用程序的V2.0,現在我正在嘗試隔離服務中的所有模型邏輯,並將活動層與此分開。這樣做的目的是服務可以在後臺生活,並針對Web服務運行定期更新。 我的問題是,只要我嘗試使用反射來實例化一個實現parcelable接口的對象,它就會引發一個InstantiationException。我的猜測是,parcelable接口在某種程度上會干擾對象的默認構造函數。可以在實現可分段接口的對象上使用java反射嗎?

一種解決方案是使我生成併發送對象正確parcelable對象的構造和發送對象在IPC的中間對象。但我覺得可能有一個更簡單的解決方案,包括以某種方式使用parcelable,我還沒有想過。

public class ManagedObjectWrapper {

private Object anObject;//the instance of the object itself 
    private Class<?> theClass;//Metadata 
    private Field[] declaredFields;//Metadata 

    public ManagedObjectWrapper(Class<?> c){ 

     theClass=c; 
     declaredFields = c.getDeclaredFields(); 
     try { 
          //this is where it crashes 
      anObject = c.newInstance(); 
     } catch (InstantiationException e) { 

      e.printStackTrace(); 
     } catch (IllegalAccessException e){ 
      e.printStackTrace(); 
     } 
    } 

    public Object GetObject(){return this.anObject;} 
    public Class<?> GetClass(){return this.theClass;} 
    public Field[] GetDeclaredFields(){return this.declaredFields;} 

}

這是我如何使用反射來從JSON

private ArrayList<ManagedObjectWrapper> getObjectsFromJSON(String pluralizedColumn,JSONArray array) throws Exception 
    { 
     ArrayList<ManagedObjectWrapper> returnList = new ArrayList<ManagedObjectWrapper>(); 
     String packageName = extContext.getPackageName(); 
     String singularObjectName = pluralizedColumn.substring(0, pluralizedColumn.length()-1);//remove the plural s 
     String canonicalClassName = packageName.concat(".").concat(singularObjectName); 
     Class<?> theClass = Class.forName(canonicalClassName); 

     for(int i = 0;i < array.length(); i++){ 

      ManagedObjectWrapper mow = new ManagedObjectWrapper(theClass); 

      JSONObject obj = array.getJSONObject(i); 
       for(Field field : mow.GetDeclaredFields()){ 
         Class<?>[] params = {field.getType() 
          }; 
        if(!field.getName().contentEquals("CREATOR")){ 
         Method setterMethod = mow.GetClass().getDeclaredMethod(SET_METHOD_PREFIX.concat(field.getName()),params); 
         Object nullTest = obj.get(field.getName()); 

        if(nullTest.equals(null)){ 

         }else{ 
          setterMethod.invoke(mow.GetObject(), obj.get(field.getName())); 
         } 
        } 

       } 

     returnList.add(mow); 
    } 

回答

0

是的,它可以讓我的對象。只需在該類上實現一個默認的構造函數,其他更深層次的代碼中的隱藏錯誤讓我覺得並不那麼簡單。但回到這個問題讓我再試一次,現在它像以前一樣工作

相關問題