Análisis de la diferencia entre Class.getResource y ClassLoader.getResource
Cuando la ruta no comienza con "/", el recurso se obtendrá del paquete donde se encuentra la clase de forma predeterminada cuando la ruta comienza con "/",; el recurso se obtendrá del proyecto Obtenga recursos del directorio raíz de ClassPath. "/" aquí se refiere a ClassPath
JDK ha configurado dicha regla, que es fácil de entender. Cuando la ruta no comienza con "/", podemos obtener el mismo archivo de recursos de la ruta. de la clase actual. Cuando comienza con "/", los recursos se pueden obtener de cualquier ruta en el directorio raíz de ClassPath. out.println(Test.class.getResource("/"));
}
Método de ejecución: file:/D:/work_space/java/bin /net/swiftlet/ file:/D:/work_space/java/bin/
Class.getClassLoader()getClassLoader().getResource(String path)
Cuando la ruta no puede comenzar con '/', Ruta se refiere a la carga del cargador de clases en forma de delegación ascendente durante el proceso de carga de recursos. '/' representa el rango de carga del Boot ClassLoader. Dado que este tipo de cargador se implementa en C++, el rango de carga está vacío. getResource("/"));
}
}
Ejecute de la siguiente manera: file:/D:/work_space/java/bin/null Como pueda Como se puede ver en lo anterior: class .getResource("/") == class.getClassLoader().getResource("") De hecho, Class.getResource y ClassLoader.getResource son esencialmente iguales, ambos usan ClassLoader.getResource para cargar recursos . Consulte el siguiente código fuente de la clase jdk:
public java.net.URL getResource(String name)
{
name = resolveName(name);
ClassLoader cl = getClassLoader0();
if (cl==null)
{
// Una clase del sistema.
return ClassLoader.getSystemResource(name);
}
Class.getResource y Class.getResourceAsStream se utilizan para la misma selección de ruta.
ClassLoader.getResource y ClassLoader.getResourceAsStream tienen la misma selección de ruta cuando se usan.
Resumen: Al obtener la ruta del recurso, se recomienda usar class.getResource, especialmente en el caso de class.getResource("/"), de lo contrario si usa class().getClassLoader(). getResource("" ), debe considerar la selección de ruta de class().getClassLoader().getResource(""). En el caso de que getClassLoader() pueda estar vacío (si la clase actual la carga el cargador de arranque raíz inicial de jvm, el valor de retorno está vacío), es más conveniente usar class.getResource("/") directamente.