Changement de bibliothèque de gestion de réflexion Java

Ok alors j'ai une application Android et j'ai commencé à créer un système addon pour l'application afin que les développeurs puissent coder des fournisseurs de contenu que l'application peut alors utiliser pour générer des contenus différents, je ne passerai pas sur l'ensemble de la procédure mais tout fonctionne bien comme ça:

1) J'ai créé une bibliothèque appelée com.myaddonlib que j'ai importé dans mon projet dans cette bibliothèque. Il existe une interface et des objets différents.

  • Existe-t-il un moyen de vérifier si une signature d'application est débogée ou publiée?
  • Quelles sont les valeurs de temps réelles de ms pour les constantes animTime d'Android?
  • Application Android Connexion au serveur Node.js à l'aide de Socket.io
  • Auditeur réseau Android
  • Android: comment définir la vue du texte en gras en codant non via XML
  • NullPointerException avec ProgressBar à l'aide de ActionBarCompat
  • 2) Maintenant, un développeur peut créer un projet Java simple à sa fin, importer la bibliothèque com.myaddonlib et implémenter l'interface sur sa classe principale qui possède des méthodes qui renvoient différents objets de la bibliothèque.

    3) Retour sur l'application Android, je peux charger le fichier .jar créé par le développeur (après que les classes.dex soient ajoutées au fichier jar) et avec le DexClassLoader Android, 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 addon qui implémente l'interface à partir de la bibliothèque résidant dans un package nommé com.apackage . Je peux ensuite lancer l'interface de la bibliothèque com.myaddonlib à une nouvelle instance de classToLoad et appeler les fonctions que le développeur addon a mises en œuvre.

    Maintenant, voici le problème, disons, j'ai décidé de mettre à jour la bibliothèque addon et de supprimer une des variables d'une classe, ce qui signifie que la classe addon est maintenant différente de la classe dans la bibliothèque mise à jour (utilisée dans l'application). Même lorsque la variable modifiée n'est pas utilisée, quelque chose cause l'erreur de l'application sans erreur. Juste le fait que les deux classes sont différentes (même lorsque la seule différence est juste une variable manquante) provoque un dysfonctionnement de quelque chose. Maintenant, ce n'est pas une procédure facile à expliquer, donc je comprendrais que, compte tenu de 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 la 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

    One Solution collect form web for “Changement de bibliothèque de gestion de réflexion Java”

    Ma solution ne résout pas le problème, mais s'assure que cela n'arrivera jamais. Le problème que vous décrivez ressemble au problème classique du serveur et du client. Vous avez un serveur (dans votre cas, l'application que vous développez) et les clients (les addons qui sont é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 / analyse, mais chaque fois que vous modifiez l'API sur le serveur, vous devrez mettre à jour tous les clients (ou d'autres collisions ou d'autres problèmes pourraient se produire).

    Donc, pour résoudre ce problème sur le serveur-client, beaucoup choisissent d'utiliser des appels HTTP avec des objets JSON qui décrivent les données. Bien que cette façon soit moins efficace, elle permet d'ajouter des API et de soutenir plusieurs versions de client en même temps.

    L'utilisation de cette approche dans Android est assez simple. Définissez une API avec deux fonctions et une interface unique:

     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 transférer toutes les données entre la bibliothèque et les addons et cela ne changera jamais, de sorte qu'aucun collision ne se produirait. Une amélioration peut être de forcer le passage du numéro de version pour permettre à la bibliothèque de prendre en charge les versions multiples).

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.