El comportamiento correcto para un cargador de clases en Java es:Clasificadores de Java: ¿por qué buscar primero el cargador de clases padre?
- Si ya se ha cargado, devolver la clase
- llame al padre loadClass()
- Trate de cargar la clase misma.
Por lo tanto, la clase definida en el classpath del sistema siempre debe cargarse primero. Tomcat define el cargador de clases por guerra, que tiene el cargador de clases del sistema como principal, por lo que si intenta cargar una clase, primero buscará en el classpath del sistema y luego en el classpath definido en el archivo war.
Según mi entendimiento, esto es por dos razones:
- para evitar problemas con las diferentes versiones de las clases que se utilizan. Imagina que redefiní java.lang.Object en una guerra, sería una pesadilla.
- Para evitar dependencias en los cargadores de clase secundarios: El cargador de clases del sistema no puede depender de los cargadores de clase secundarios: sería difícil volver a desplegar una guerra, por ejemplo.
Entonces, la pregunta es:
Además de los problemas anteriores, ¿hay otros peligros para la implementación de un cargador de clases que no hace una búsqueda de los padres en primer lugar?
JFYI: java.lang.Object no se cargaría de la guerra. Hay una comprobación explícita para java.lang en ClassLoader. Solo se puede cargar desde la ubicación de arranque. –