2012-01-30 84 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

是的,它可以让我的对象。只需在该类上实现一个默认的构造函数,其他更深层次的代码中的隐藏错误让我觉得并不那么简单。但回到这个问题让我再试一次,现在它像以前一样工作

相关问题