classpath:mysql
classpath:oracle
为什么不是classpath的绝对路劲加上/oracle或者/mysql呢
他是怎么找这个路劲的?
我知道双亲委派和沙箱机制,不要笼统和我讲这么两个概念,因为我还是没懂为啥会是这种情况?求教!在线等
首先,我们要达成一个基础的共识是,Thread.currentThread().getContextClassLoader(). 通过这段代码可以获得当前线程的一个类加载器。然后通过getResource方法去类加载器找到resourceName这个文件的相对路径
我们可以找到getResource()这段代码,从这段代码可以看到,它的加载顺序是:先去父加载器去加载资源文件,如果找不到,则会去BootstrapLoader中去找。如果还是找不到,才会调用当前类的classLoader去找。这就是双亲委派。当资源被找到之后,就会返回改文件的URL地址。
public URL getResource(String name) {
URL url;
if (parent != null) {
url = parent.getResource(name);
} else {
url = getBootstrapResource(name);
}
if (url == null) {
url = findResource(name);
return url;
JVM中内置了三个重要的ClassLoader,分别是BootstrapClassLoader、ExtensionClassLoader、AppClassLoader 这三个类加载器分别会加载不同路径下的class文件。
BootstrapClassLoader负责JVM运行时的核心类, JAVA_HOME/lib/
ExtensionClassLoader负责加载JVM扩展类,JAVA_HOME/lib/ext/*.jar
AppClassLoader 负责加载classpath路径下的jar或者目录
所以,你通过当前线程的类加载器来加载资源时,输出的路径会不一样,原因就是因为用到了不同的加载器,比如最后一个oracle,应该是使用了BootstrapClassLoader; mysql,采用了AppClassLoader
首先,我们要达成一个基础的共识是,Thread.currentThread().getContextClassLoader(). 通过这段代码可以获得当前线程的一个类加载器。然后通过getResource方法去类加载器找到resourceName这个文件的相对路径
我们可以找到getResource()这段代码,从这段代码可以看到,它的加载顺序是:先去父加载器去加载资源文件,如果找不到,则会去BootstrapLoader中去找。如果还是找不到,才会调用当前类的classLoader去找。这就是双亲委派。当资源被找到之后,就会返回改文件的URL地址。
public URL getResource(String name) {
URL url;
if (parent != null) {
url = parent.getResource(name);
} else {
url = getBootstrapResource(name);
}
if (url == null) {
url = findResource(name);
}
return url;
}
JVM中内置了三个重要的ClassLoader,分别是BootstrapClassLoader、ExtensionClassLoader、AppClassLoader 这三个类加载器分别会加载不同路径下的class文件。
BootstrapClassLoader负责JVM运行时的核心类, JAVA_HOME/lib/
ExtensionClassLoader负责加载JVM扩展类,JAVA_HOME/lib/ext/*.jar
AppClassLoader 负责加载classpath路径下的jar或者目录
所以,你通过当前线程的类加载器来加载资源时,输出的路径会不一样,原因就是因为用到了不同的加载器,比如最后一个oracle,应该是使用了BootstrapClassLoader; mysql,采用了AppClassLoader