Pregunta

Puede alguien que me señale un buen recurso o yo explicar sobre el concepto detrás de Clase Cargadores? He encontrado el siguiente recurso de cargadores de clases http://www.onjava.com/lpt/a/5586 pero aún ninguna ayuda. Las siguientes preguntas pueden parecer tonto, pero tratando de responder a ellos siempre me confunde.

  • ¿Por qué los desarrolladores a escribir cargadores de clases personalizados, por qué no invocar un cargador de clases Bootstrap para invocar sus clases personalizadas? ¿Cuál es la necesidad de definir los cargadores de clases personalizados?
  • ¿Por qué hay tantas variedades de cargadores de clases? por ejemplo:. Bootsrap, Comman, Catalina cargador de clases, etc.,

    Gracias de antemano.

¿Fue útil?

Solución

He encontrado las siguientes razones válidas, para crear cargadores de clases personalizados:

  1. ¿Quieres cargar una clase de una fuente no convencional (Por ejemplo, el código de bytes para una clase se almacena en una base de datos, a través de la red o realizado como 0 y 1 s por palomas - MessengerPidgeonClassLoader). Ya hay algunas implementaciones ClassLoader en el API para estos casos, tales como URLClassLoader .

  2. Es necesario definir una jerarquía diferente para cargar clases. implementaciones por defecto del delegado ClassLoader la búsqueda primero el padre, luego tratan de cargar la clase sí mismos. Tal vez usted quiere una jerarquía diferente. Esta es la razón por la OSGi y Eclipse tienen sus propios cargadores de clases ya que los archivos de manifiesto .MF definen todo tipo de caminos de jerarquía extraños (buddy-carga de clases, por ejemplo). Todos los cargadores de clases de Eclipse implementar la interfaz BundleClassLoader y tienen algo de código adicional para encontrar los recursos dentro de Eclipse Plug-ins.

  3. Es necesario hacer algunas modificaciones al código de bytes. Tal vez el código de bytes es encriptada, y se le desencriptar sobre la marcha ( No es que ayuda, de verdad, pero se ha intentado ). Tal vez usted quiere "parche" las clases cargadas sobre la marcha (a la mejora de JDO código de bytes).

El uso de un cargador de clases diferentes que se requiere que el cargador de clases del sistema si necesita descargar las clases de memoria, o para cargar las clases que podría cambiar su definición en tiempo de ejecución. Un caso típico es una aplicación que genera una clase sobre la marcha de un archivo XML, por ejemplo y, a continuación, intenta volver a cargar esta clase. Una vez que una clase está en el cargador de clases del sistema, no hay manera de descargarlo y tener una nueva definición.

Otros consejos

Un uso común de cargadores de clases es aislar un JAR. Si usted tiene una aplicación que utiliza plugins ( Eclipse , Maven 2 ), entonces puede tener esta situación: Plugin X necesita frasco A con la versión 1.0 mientras Plugin Y necesita el mismo frasco pero la versión 2.0. X no funciona con la versión 2.0, sin embargo.

Si tiene cargadores de clases, puede crear particiones de clases (pensar en islas aisladas conectadas por puentes delgados; los puentes son los cargadores de clases). De esta manera, los cargadores de clases pueden controlar lo que cada plugin puede ver.

Cuando Plugin X crea la instancia de una clase Foo, que tiene los campos estáticos, esto no es problema y no será una confusión con la "misma" clase en plugin de Y debido a que cada cargador de clases, de hecho, crear su propia instancia de la clase foo. A continuación, tiene dos clases de memoria, donde cl1.getName().equals(cl2.getName()) es true pero cl1.equals(cl2) no lo es. Esto significa que los casos de CL1 no son asignación compatible a los casos de Cl2. Esto puede conducir a la extraña ClassCastExceptions que dicen que org.project.Foo no se puede asignar a org.project.Foo.

Al igual que con las islas remotas, las dos clases no son conscientes de que existe la otra. Piense de clones humanos que nacen y luego criados en las diferentes islas. Desde el punto de vista de la máquina virtual, no hay problema, ya que las instancias de la clase de tipo se manejan como cualquier otro objeto: No puede haber varios de ellos. Que usted piensa que algunos de ellos son "la misma" no importa a la máquina virtual.

Otro uso de este patrón es que usted puede deshacerse de las clases cargadas de esta manera: Sólo asegúrese de que nadie tiene un puntero a cualquier objeto creado a partir de las clases cargadas desde un cargador de clases y luego olvidarse del cargador de clases, también. En la siguiente ejecución de la GC , todas las clases cargadas por el cargador de clases se eliminan de la memoria . Esto le permite a "recargar" su aplicación sin tener que reiniciar todo el equipo virtual.

Un par de blogs que he escrito en el pasado profundo sobre el uso de cargadores de clases posteriores a la delegación:

No se puede ir más allá de la fuente de crudo, en casos como este. Si realmente quieren la droga en el interior, el núcleo duro , lea los bits correspondientes de la máquina virtual Java Especificación .

Otra buena conexión para cargadores de clases de Java - cargadores de clases Java

Es extremadamente raro que se necesita para crear su propio cargador de clases. Y genereally si es necesario, ya debería tener una muy buena comprensión de lo que el cargador de clases.

En otras palabras, si estás preguntando por qué se necesita para crear su propio cargador de clases, entonces no es necesario crear uno;)

Una vez dicho esto, también he visto un cargador de clases que se está creando para una aplicación que se ocupa de la criptografía. De esta manera cada vez que se crea una java.netSocket o algún tipo de objeto de archivo / corriente, en lugar de utilizar las versiones de JVM sería utilizar sus propias clases hecha a la medida especial. De esta manera se podría garantizar la que toda la información se encripta y que no hubo errores de desarrolladores.

Pero no es muy común. Usted puede ir toda una carrera de Java sin tener que tener que crear su propio cargador de clases personalizadas. En realidad, si es necesario crear uno, que realmente debe preguntar si es necesario.

  

¿Por qué los desarrolladores a escribir cargadores de clases personalizados, ¿por qué no invoca un cargador de clases Bootstrap para invocar sus clases personalizadas? ¿Cuál es la necesidad de definir los cargadores de clases particulares?

Dependiendo de la aplicación, los desarrolladores podrían anular o sustituir por completo el mecanismo de carga de clases para que se adapte a sus necesidades.

Por ejemplo, he utilizado una aplicación cuyas clases se cargan desde un LDAP: S

Otras aplicaciones necesitan gestionar clase independiente (como la mayoría de los servidores de aplicaciones que soportan caliente de implementar)

Sobre los recursos, hay toneladas, en la web, que simplemente no se pueden enumerar.

Un ejemplo:

Tomcat usar WebAppClassloader personalizado para cargar y aislar clases / frascos de diferentes aplicaciones web.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top