2012-01-30 4 views
0

Ранее я написал приложение, которое использовало отражение для сериализации данных от json к объектам, и это решение отлично работало. Теперь я работаю над V2.0 этого приложения, и теперь я пытаюсь изолировать всю логику модели в сервисе и сделать слой активности отдельно от этого. Цель этого заключается в том, что служба может жить в фоновом режиме и запускать периодические обновления против веб-службы. Моя проблема заключается в том, что как только я попытаюсь использовать отражение для создания объекта, реализующего разборчивый интерфейс, он генерирует исключение InstantiationException. Я предполагаю, что посыльный интерфейс каким-то образом препятствует конструктору по умолчанию для объекта.Можно ли использовать отражение java на объектах, реализующих разборчивый интерфейс?

Одним из решений является создание промежуточного объекта, который я собираю, а затем отправляю этот объект в конструктор правильного подробного объекта и отправляет этот объект в IPC. Но я чувствую, что может быть более простое решение, связанное с использованием в какой-то мере объяснимого, о котором я еще не думал.

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

Да, может. Просто реализуйте конструктор по умолчанию для класса, другие более глубоко скрытые ошибки в коде заставили меня подумать, что это было не так просто. Но круживший к этому вопросу заставил меня попробовать его снова, и теперь он работает так же, как и раньше