Ранее я написал приложение, которое использовало отражение для сериализации данных из 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);
}