2009-02-25 9 views
22

Recientemente me preguntaron en una entrevista sobre el orden en que se llaman los cargadores de clases cuando se carga una clase.¿Qué razones tuvieron las personas para escribir su propio cargador de clases?

Desafortunadamente, nunca he tenido la necesidad de escribir mi propio cargador de clases, por lo que en ese momento no estaba familiarizado con las complejidades de la carga de clases.

Esto me hizo preguntarme, ¿qué razones tienen para escribir su propio cargador de clases.

Así que esa es mi pregunta: ¿Qué escenarios enfrentaron las personas que requirieron la necesidad de escribir sus propios cargadores de clases?

+0

En palabras muy sencillas, por defecto de la clase cargadoras que vienen con JRE puede cargar clases de ruta de clase (sistemas de archivos), URL (por ejemplo, tomas de clase cargador de applet, RMI cargador de clases), etc. Si esto no es suficiente o no carga su clases correctamente (p. ej., se deben cargar diferentes versiones de la misma clase), necesita escribir sus propios cargadores de clases personalizados. –

Respuesta

10

La razón más común es que su aplicación aloja otras aplicaciones que usan las mismas bibliotecas en versiones diferentes en el mismo tiempo de ejecución (por ejemplo, Tomcat). Por lo tanto, debe asegurarse de que su cargador de clases pueda proporcionar diferentes versiones de la misma clase para cada una de estas aplicaciones.

EDITAR:

Para aclarar esto un poco (ver la confusión en los comentarios): Cuando dicho "su cargador de clase" I ment "una implementación de java.lang.ClassLoader" no es una instancia de una clase tal. En realidad, es su classloader s en ambos sentidos: la gente de Tomcat implementó diferentes ClassLoader -classes y tienen incluso más instancias en tiempo de ejecución ... para más detalles, vea el corresponding docs.

+0

, en realidad tendría que cargar diferentes versiones de la misma clase con diferentes instancias de su cargador de clases. Un cargador de clases no puede tener dos versiones de la misma clase al mismo tiempo ... – pgras

+0

@pgras: Creo que eso es lo que quiso decir kai1968 ... "su cargador de clases" == "los cargadores de clases utilizados en su aplicación", al menos así es como yo léelo. –

2

Tuve que implementar un ClassLoader una vez cuando quería cargar clases en archivos .jar desde un archivo .jar (esto fue hace unos años, estoy seguro de que ahora hay herramientas que pueden hacer eso por usted) es decir, pondría sus archivos .jar de dependencia en un archivo .jar.

Pero esa es la única vez, en mi experiencia escribiendo un ClassLoader personalizado es algo bastante raro.

3

Algunos lugares realmente almacenan clases en una base de datos (bueno, solía haber lugares, no estoy seguro si ya existen) y usan un cargador de clases para obtener las clases de la base de datos en tiempo de ejecución.

+2

Mi empresa hizo esto para que un desarrollador pudiera escribir un complemento y cargarlo en la aplicación sin tiempo de inactividad. Principalmente pasamos a usar lenguajes de scripting (Groovy, JRuby) para esa funcionalidad, pero fue divertido mientras duró. –

16

Actualmente estoy trabajando en una aplicación extremadamente grande que está altamente modularizada, es decir, consta de literalmente cientos de archivos JAR. Esto significa que la cadena classpath se convirtió en enorme, causando todo tipo de problemas en todo tipo de lugares, debido a la incapacidad de varias herramientas de desarrollo para tratar con una cadena classpath de 5KB. Esto se solucionó escribiendo un cargador de clases personalizado que lea su ruta de clases desde un archivo.

0

Teníamos un marco de aplicación que tenía aplicaciones basadas en él que estaban 'vinculadas estáticamente'. Esto significaba que necesitabas tener una instancia de jvm por cada aplicación que querías ejecutar, lo que no solo era malo para el uso de la memoria, sino que significaba que no podrías tener una súper aplicación desde la que ejecutar las distintas aplicaciones, o cualquier otra aplicación fácil (no interproceso) comunicación entre las aplicaciones en ejecución.

Dado que todo se ejecutó desde webstart (es decir, con un grupo de jar como classpath), la solución para evitar que el cargador de clases del sistema encontrara las clases fue compensar los paquetes. Para expample si tenía una clase a.b.X en una aplicación foo, entonces estaría en el archivo jar como foo/a/b/X.class.

6

Aburrimiento y el deseo de atormentar a mis compañeros de trabajo cuando tenían que mantener mi código. :)

0

En mi último trabajo implementamos un servidor que podría tener "definiciones de consulta lógica de complemento". (El cliente podía llamar consultas por nombre, el servidor buscaba la consulta registrada para ese nombre y lo ejecutaba).

Las definiciones de consulta fueron código y/o metadatos contenidos en un jar.

El jar se cargó en el servidor a través de nuestra aplicación de consola.

Cuando se carga (y más tarde cuando se reinicia el servidor), nuestro marco crearía un cargador de clases para que el contenedor lo cargue en el servidor en ejecución.

1

Encontré un article que explica por qué (muy brevemente) OSGI usa un cargador de clases personalizado.

0

Tengo que hacer una sola vez. Tenemos que usar una API proporcionada por un proveedor externo, y esta API usa una versión extraña de hibernate3.jar. Por lo tanto, tuvimos que cargar este jar específico con un cargador de clases personalizado para evitar la excepción de "UID de la versión en serie".

0

He visto una buena publicación here. Habla sobre diferentes cargadores de clases, jerarquía de cargador de clases y cargador de clases personalizado.

0

Puede hacer lanzamientos de software sin el tiempo de inactividad, un poco de situaciones en sistemas que funcionan 24x7.
Puede escribir su propia llamada de cargador de clases desde JMX y reemplazar el archivo de clase en tiempo de ejecución.

Cuestiones relacionadas