Question Modifications apportées à la bibliothèque de gestion de la réflexion Java


Ok donc j'ai une application Android et j'ai commencé à créer un système additif pour l'application afin que les développeurs puissent coder les fournisseurs de contenu que l'application peut ensuite utiliser pour générer un contenu différent, je ne vais pas passer par toute la procédure mais

1) J'ai créé une bibliothèque appelée com.myaddonlib que j'ai importé dans mon projet dans cette bibliothèque, il y a une interface et différents objets.

2) Désormais, un développeur peut créer un projet Java simple, importer la bibliothèque com.myaddonlib, et implémente l’interface sur sa classe principale qui dispose de méthodes renvoyant différents objets de la bibliothèque.

3) De retour sur l'application Android, je peux charger le fichier .jar créé par le développeur (après l'ajout de classes.dex au fichier jar) et avec l'android DexClassLoader, je peux charger l'interface implémentée comme suit:

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

Addon est la classe créée par le développeur d'addons qui implémente l'interface de la bibliothèque résidant dans un package nommé com.apackage. Je peux alors lancer l'interface depuis la bibliothèque com.myaddonlib à une nouvelle instance de classToLoad et appeler les fonctions implémentées par le développeur d'addons.

Maintenant, voici le problème disons que j'ai décidé de mettre à jour la bibliothèque addon et de supprimer l'une des variables d'une classe, ce qui signifie que la classe de l'addon est maintenant différente de la classe de la bibliothèque mise à jour (utilisée dans l'application). Même lorsque la variable modifiée n'est pas utilisée, quelque chose provoque le blocage de l'application sans aucune erreur. Le simple fait que les deux classes soient différentes (même si la seule différence est simplement une variable manquante) entraîne un dysfonctionnement. Maintenant, ce n'est pas une procédure facile à expliquer, donc je comprendrais que, étant donné mon mauvais anglais, certains ont du mal à suivre. Mon problème est que je dois savoir comment éviter ce crash en raison du changement de bibliothèque sur l’une des deux extrémités. Et aussi comment Java traite les changements d'objet dans une situation comme celle-ci


11
2018-04-29 01:59


origine


Réponses:


Ma solution ne résout pas le problème, mais assure plutôt que cela n'arrivera jamais. Le problème que vous décrivez ressemble au problème serveur-client classique. Vous avez un serveur (dans votre cas, l'application que vous développez) et des clients (les addons écrits par les développeurs). Vous pouvez définir une interface avec de nombreuses fonctions et transmettre des données dans des structures binaires. Cela serait plus efficace du point de vue du trafic et de l'analyse, mais chaque fois que vous modifiez l'API sur le serveur, vous devrez mettre à jour tous les clients (ou des blocages ou d'autres problèmes risquent de se produire).

Donc, pour résoudre ce problème sur le serveur client, beaucoup choisissent d’utiliser les appels HTTP avec JSON objets décrivant les données. Bien que cette méthode soit moins efficace, elle permet d’ajouter des API et de prendre en charge plusieurs versions de clients en même temps.

L'utilisation de cette approche sous Android est assez simple. Définir une API avec deux fonctions et une seule interface:

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 
}

Comme vous pouvez le voir, si vous implémentez cette interface, vous pouvez transmettre toutes les données entre la bibliothèque et les addons et cela ne changera jamais. Une amélioration peut être de forcer le passage du numéro de version pour permettre à la bibliothèque de prendre en charge le multi-versioning).


2
2018-05-08 18:08