Android java反射可以用于实现parcelable接口的对象吗?

Android java反射可以用于实现parcelable接口的对象吗?,android,service,ipc,parcelable,Android,Service,Ipc,Parcelable,之前,我编写了一个应用程序,使用反射将数据从json序列化到对象,该解决方案运行良好。现在我正在开发这个应用程序的V2.0,我正在尝试隔离服务中的所有模型逻辑,并使活动层与之分离。这样做的目的是服务可以在后台运行,并对web服务定期进行更新。 我的问题是,只要我尝试使用反射来实例化实现parcelable接口的对象,它就会抛出一个InstanceException。我的猜测是,parcelable接口在某种程度上干扰了对象的默认构造函数 一种解决方案是生成一个我构建的中间对象,然后将该对象发送给

之前,我编写了一个应用程序,使用反射将数据从json序列化到对象,该解决方案运行良好。现在我正在开发这个应用程序的V2.0,我正在尝试隔离服务中的所有模型逻辑,并使活动层与之分离。这样做的目的是服务可以在后台运行,并对web服务定期进行更新。 我的问题是,只要我尝试使用反射来实例化实现parcelable接口的对象,它就会抛出一个InstanceException。我的猜测是,parcelable接口在某种程度上干扰了对象的默认构造函数

一种解决方案是生成一个我构建的中间对象,然后将该对象发送给正确的可包裹对象的构造函数,并在IPC中发送该对象。但我觉得可能有一个更简单的解决方案,涉及到以某种方式使用我还没有想到的包裹


公共类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;}
private Object anObject;//对象本身的实例
私有类类;//元数据
私有字段[]declaredFields;//元数据
公共ManagedObjectWrapper(c类){
类=c;
declaredFields=c.getDeclaredFields();
试一试{
//这就是它崩溃的地方
anObject=c.newInstance();
}捕获(实例化异常e){
e、 printStackTrace();
}捕获(非法访问例外){
e、 printStackTrace();
}
}
公共对象GetObject(){返回this.anObject;}
公共类GetClass(){返回this.theClass;}
公共字段[]GetDeclaredFields(){返回此.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);
    }
private ArrayList getObjectsFromJSON(字符串pluralizedColumn,JSONArray数组)引发异常
{
ArrayList returnList=新建ArrayList();
字符串packageName=extContext.getPackageName();
String singularizedColumn.substring(0,pluralizedColumn.length()-1);//删除复数s
字符串canonicalClassName=packageName.concat(“.”).concat(singularObjectName);
Class theClass=Class.forName(规范类名);
对于(int i=0;i

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