Me pregunto cuál es la diferencia entre Class.getResource()
y ClassLoader.getResource()
.
editar: especialmente quiero saber si hay algún almacenamiento en caché a nivel de archivo / directorio. Como en "¿se almacenan en caché las listas de directorios en la versión Class?"
AFAIK lo siguiente esencialmente debería hacer lo mismo, pero no lo son:
getClass().getResource()
getClass().getClassLoader().getResource()
Descubrí esto al jugar con un código de generación de informes que crea un nuevo archivo WEB-INF/classes/
desde un archivo existente en ese directorio. Al usar el método de Class, pude encontrar archivos que estaban allí durante el despliegue usando getClass().getResource()
, pero al tratar de recuperar el archivo recién creado, recibí un objeto nulo. Navegar por el directorio muestra claramente que el nuevo archivo está allí. Los nombres de los archivos se anteponen con una barra diagonal como en "/myFile.txt".
La ClassLoader
versión de, getResource()
por otro lado, encontró el archivo generado. Según esta experiencia, parece que hay algún tipo de almacenamiento en caché de la lista del directorio. ¿Tengo razón, y si es así, dónde está documentado?
De los documentos de API enClass.getResource()
Encuentra un recurso con un nombre de pila. El cargador de clases definitorias de la clase implementa las reglas para buscar recursos asociados con una clase determinada. Este método delega al cargador de clases de este objeto. Si este objeto fue cargado por el cargador de clases bootstrap, el método delega a ClassLoader.getSystemResource (java.lang.String).
Para mí, esto dice "Class.getResource realmente está llamando a getResource () de su propio cargador de clases". Lo cual sería lo mismo que hacer getClass().getClassLoader().getResource()
. Pero obviamente no lo es. ¿Podría alguien proporcionarme alguna iluminación sobre este asunto?