Можно ли использовать Java-отражение в объектах, которые реализуют интерфейс, пригодный для разделения? - PullRequest
0 голосов
/ 30 января 2012

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

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

public class ManagedObjectWrapper {</p> <pre><code> 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

</p> <pre><code>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); }

1 Ответ

0 голосов
/ 09 февраля 2012

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

...