Изменения в библиотеке обработки отражений Java

Хорошо, поэтому у меня есть приложение для Android, и я начал создавать аддонную систему для приложения, чтобы разработчики могли кодировать контент-провайдеров, которые приложение может использовать для создания другого контента, я не буду проходить всю процедуру, но все работает отлично, как так:

1) Я создал библиотеку под названием com.myaddonlib, которую я импортировал в своем проекте в этой библиотеке, есть интерфейс и разные объекты.

2) Теперь разработчик может создать простой проект Java на своем конце, импортировать библиотеку com.myaddonlib и реализовать интерфейс в своем основном классе, который имеет методы, которые возвращают разные объекты из библиотеки.

3) Вернемся к андроидному приложению, я могу загрузить файл .jar, созданный разработчиком (после добавления в файл jar файла classes.dex) и с помощью android DexClassLoader я могу загрузить реализованный интерфейс так:

DexClassLoader classloader = new DexClassLoader(jarFilePath, tempDirectory, null, context.getClass().getClassLoader());     
Class classToLoad = classloader.loadClass("com.apackage.Addon");

где Addon - класс, созданный разработчиком аддона, который реализует интерфейс из библиотеки, находящейся в пакете с именем com.apackage. Затем я могу передать интерфейс из библиотеки com.myaddonlib в новый экземпляр classToLoad и вызвать функции, которые реализовал разработчик аддона.

Теперь вот проблема: я решил обновить библиотеку аддонов и удалить одну из переменных из класса, а это значит, что класс аддона теперь отличается от класса обновленной библиотеки (используется в приложении). Даже когда измененная переменная не используется, приложение вызывает сбой без каких-либо ошибок. Просто тот факт, что оба класса различны (даже когда единственная разница - просто недостающая переменная) приводит к некорректной работе. Теперь это непростая процедура для объяснения, поэтому я бы понял, что, учитывая мой плохой английский, некоторые из них не могут следовать. Моя проблема в том, что мне нужно знать, как избежать этого сбоя из-за изменения библиотеки на одном из двух концов. А также, как java обрабатывает изменения объекта в такой ситуации

Ответ 1

Мое решение не решает проблему, но вместо этого гарантирует, что этого никогда не произойдет. Проблема, которую вы описываете, напоминает классическую проблему с сервером-клиентом. У вас есть сервер (в вашем случае приложение, которое вы разрабатываете) и клиенты (аддоны, написанные разработчиками). Вы можете определить интерфейс со многими функциями и передать данные в двоичных структурах. Это было бы более эффективно с точки зрения трафика/разбора, однако всякий раз, когда вы меняете API на сервере, вам придется обновлять все клиенты (иначе могут произойти сбой или другие проблемы).

Итак, чтобы решить эту проблему на сервере-клиенте, многие предпочитают использовать HTTP-вызовы с JSON объекты, которые описывают данные. Хотя этот способ менее эффективен, он позволяет одновременно добавлять API и поддерживать множество клиентских версий.

Использование этого подхода в Android довольно просто. Определите API с двумя функциями и одним интерфейсом:

public String sendDataToLibrary(String jsonString) {
   // Parse data, perform operation and return a JSON string as the result
}

public interface GetDataFromLibrary {
   String onDataFromLibrary(String jsonString);
}

public void init startLibrary(GetDataFromLibrary callback) {
   // Set callback in library and call it whenever you have data that needs to be sent out from the library asynchronously 
}

Как вы можете видеть, если вы реализуете этот интерфейс, вы можете передавать любые данные между библиотекой и аддонами, и это никогда не изменится, поэтому никаких сбоев не произойдет. Улучшение может состоять в том, чтобы принудительно передать номер версии, чтобы библиотека поддерживала мультиверсию).