以前我寫過一個應用程序,它使用反射來將數據從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);
}