Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Reflexión de Java que maneja cambios de la biblioteca

Ok, así que tengo una aplicación para Android y comencé a crear un sistema de complemento para la aplicación para que los desarrolladores puedan codificar proveedores de contenido que la aplicación puede utilizar para generar contenido diferente, no pasaré por todo el procedimiento, pero todo funciona bien así:

1) com.myaddonlib una biblioteca llamada com.myaddonlib que com.myaddonlib en mi proyecto en esta biblioteca hay una interfaz y diferentes objetos.

2) Ahora un desarrollador puede crear un proyecto Java simple en su extremo, importar la biblioteca com.myaddonlib , e implementar la interfaz en su clase principal que tiene métodos que devuelven objetos diferentes de la biblioteca.

3) De vuelta en la aplicación android, puedo cargar el archivo .jar creado por el desarrollador (después de la classes.dex se agrega al archivo jar) y con el android DexClassLoader puedo cargar la interfaz implementada de la siguiente manera:

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

Donde Addon es la clase creada por el desarrollador de complemento que implementa la interfaz de la biblioteca que reside en un paquete denominado com.apackage . Entonces puedo lanzar la interfaz de la biblioteca com.myaddonlib a una nueva instancia de classToLoad y llamar a las funciones que el desarrollador de complemento implementado.

Ahora aquí está el problema permite decir que decidí actualizar la biblioteca addon y eliminar una de las variables de una clase, lo que significa que la clase del complemento es ahora diferente de la clase en la biblioteca actualizada (utilizada en la aplicación). Incluso cuando la variable cambiada no se utiliza algo hace que la aplicación se bloquee sin ningún error. Sólo el hecho de que ambas clases son diferentes (incluso cuando la única diferencia es sólo una variable que falta) hace que algo funcione mal. Ahora bien, este no es un procedimiento fácil de explicar por lo que yo entiendo que dado mi mal Inglés algunos tienen problemas para seguir. Mi problema es que necesito saber cómo evitar este choque debido al cambio de la biblioteca en uno de los dos extremos. Y también cómo java trata cambios de objetos en una situación como esta

  • Android: cómo codificar dependiendo de la versión de la API?
  • Modo de avión en Jelly Bean
  • ¿Cómo obtengo el nombre del método dentro de ese método?
  • Uso de jarras que utilizan clases java.beans (Introspector, BeanInfo o PropertyDescriptor)
  • Android / Java: ¿Llamar a un método usando reflexión?
  • Android Java objModelClass.getClass (). GetDeclaredFields () devuelve "$ change" como un campo
  • Android: cambiar el campo final estático privado usando la reflexión de java
  • ¿Debo dejar el hack de reflexión bluetooth en código de producción?
  • One Solution collect form web for “Reflexión de Java que maneja cambios de la biblioteca”

    Mi solución no soluciona el problema, sino que se asegura de que nunca sucederá. El problema que está describiendo se parece al clásico problema cliente-servidor. Usted tiene un servidor (en su caso la aplicación que está desarrollando) y los clientes (los complementos que están escritos por los desarrolladores). Puede definir una interfaz con muchas funciones y pasar datos en estructuras binarias. Esto sería más eficiente desde una perspectiva de tráfico / analizar, sin embargo cada vez que cambie la API en el servidor tendrá que actualizar todos los clientes (o bien fallos u otros problemas podrían ocurrir).

    Así que para resolver este problema en el cliente-servidor muchos optan por utilizar llamadas HTTP con objetos JSON que describen los datos. Aunque esta forma es menos eficiente, permite agregar APIs y soportar muchas versiones de cliente al mismo tiempo.

    El uso de este enfoque en Android es bastante simple. Defina una API con dos funciones y una sola interfaz:

     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 } 

    Como puede ver, si implementa esta interfaz, puede pasar cualquier dato entre la biblioteca y los complementos y nunca cambiará para que no se produzcan accidentes. Una mejora puede ser forzar pasando el número de versión para permitir que la biblioteca soporte multi-versioning).

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.