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

Ранее я написал приложение, которое использовало отражение для сериализации данных из json в объекты, и это решение работало нормально. Сейчас я работаю над версией 2.0 этого приложения и сейчас пытаюсь изолировать всю логику модели в сервисе и отделить слой активности от этого. Цель этого заключается в том, чтобы служба могла работать в фоновом режиме и запускать периодические обновления для веб-службы. Моя проблема в том, что как только я пытаюсь использовать отражение для создания экземпляра объекта, который реализует интерфейс, который может быть отделен, он создает исключение InstantiationException. Я предполагаю, что интерфейс 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);
    }

1 ответ

Решение

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

Другие вопросы по тегам