Uso correcto de Classloader (especialmente en Android)

He leído algunas documentaciones sobre los cargadores de clase, pero todavía no estoy seguro de dónde y por qué se necesitan. La API de Android dice:

Carga clases y recursos de un repositorio. Uno o más cargadores de clase se instalan en tiempo de ejecución. Se consultan cuando el sistema de ejecución necesita una clase específica que aún no está disponible en la memoria.

Así que si entiendo esto correcto, puede haber muchos classlaoders que son responsables de cargar nuevas clases. ¿Pero cómo el sistema decide qué usar? ¿Y en qué situación debería un desarrollador instanciar un nuevo cargador de clases?

En la API de Android para Intent existe un método

public void setExtrasClassLoader (ClassLoader loader) 

La descripción dice:

Establece el ClassLoader que se utilizará al desmarcar cualquier valor Parcelable de los extras de este intento.

Entonces, ¿puedo definir allí un cargador de clases especial para que pueda pasar el objeto con un intento que no se definen en la actividad de recepción? Un ejemplo:

Si la actividad A que se encuentra en el Proyecto A (en Eclipse) define un objeto que quiero enviar a la Actividad B en el Proyecto B utilizando putExtra del objeto Intent. Si este objeto que se envía sobre el Intent no está definido (código fuente en el proyecto B), entonces hay una NoClassDefFoundException. ¿Puedo usar el método setExtraClassloader para evitar esta excepción? En caso afirmativo, ¿cómo puedo decidir qué objeto del cargador de clases tengo que pasar? ¿Y cómo lo instancio correctamente?

He leído algunas documentaciones sobre los cargadores de clase, pero todavía no estoy seguro de dónde y por qué se necesitan.

En general, no es necesario que toque el sistema de cargador de clases.

¿Y en qué situación debería un desarrollador instanciar un nuevo cargador de clases?

Después de una década de experiencia en programación Java. Todos los derechos reservados

Si la actividad A que se encuentra en el Proyecto A (en Eclipse) define un objeto que quiero enviar a la Actividad B en el Proyecto B utilizando putExtra del objeto Intent. Si este objeto que se envía sobre el Intent no está definido (código fuente en el proyecto B), entonces hay una NoClassDefFoundException. ¿Puedo usar el método setExtraClassloader para evitar esta excepción?

No, porque el proyecto A y el proyecto B no pueden compartir código. Ponga la clase que necesita en ambos proyectos. O utilice una interfaz de servicio remoto con AIDL en lugar de Intents y extras. O no utilizar una clase personalizada, sino tratar el objeto como una estructura de datos (por ejemplo, utilizar un simple HashMap de Strings o algo).

Esta es una respuesta tardía, pero espero que ayude a otros.

Classloaders en general, se utilizan para cargar código Java ejecutable en tiempo de ejecución. Un buen ejemplo de esto sería un complemento que se descarga desde Internet. Puede tomar los datos binarios de un archivo de clase, cargarlos y llamar a las funciones dentro de él según sea necesario. Usted, por supuesto, necesita usar una interfaz o clase abstracta que es conocida por el programa llamante para que sepa cómo usar la clase.

Se utiliza un cargador de clases personalizado cuando los datos de la clase binaria no son accesibles en una casa solariega típica. Por ejemplo, si tiene un dispositivo bluetooth que contiene un archivo de clase con código que implementa una interfaz, necesitará escribir un cargador de clases personalizado para cargar los datos de la clase a través de la interfaz del bluetooth.

Otra razón por la que puede escribir un cargador de clases personalizado es si desea cambiar la forma en que la clase cargada accede a otras clases. Puede restringir las clases internas a las que la clase cargada tiene acceso o incluso escribir sus propias clases, cambiando el comportamiento de una clase interna. Por ejemplo, si la clase cargada utiliza la clase Java.io.File, es posible que necesite forzarla a utilizar una clase interna para acceder a los archivos de una manera diferente.

En resumen, cuando se escribe un cargador de clases personalizado, se cambia la forma en que se carga una clase, así como la forma en que la clase cargada cargará todas las demás clases.

ClassLoaders no son tan difíciles de entender, al menos en el espacio de Java. (Puedo enseñarle el sistema de ClassLoader en 90 minutos – lo hago todo el tiempo en el No Fluff Just Stuff muestra.) Dicho esto, la mayoría de las veces no es necesario crear un ClassLoader personalizado – si lo desea A futz con bytecode en el camino, java.lang.instrument es tu amigo. Si desea cargar código desde una URL, consulte java.net.URLClassLoader. Entre esos dos, la necesidad de un ClassLoader personalizado es completamente nula.

  • Android - Creación de una máscara circular en vídeo
  • Referencia a grupos coincidentes anteriores dentro de un regex
  • Barra de Acción de Android UnityPlayerActivity
  • SearchView y título de la actividad en ActionBar
  • Cómo crear un efecto de recuento para un textView en Android
  • Aumenta automáticamente un valor en Firebase
  • Corriendo Android Studio en Windows 7 falla, no Android SDK encontrado
  • Dibujo de lienzo que no se dibuja correctamente a pesar de las propiedades de configuración
  • buscando un generador mipmap en java
  • Java.net.SocketException: sendto failed: EPIPE (Broken pipe) en Android
  • Cómo cerrar / cerrar los diálogos de mensajes de la clase 0 en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.