Java 您能解释一下DriverManager.class中与类加载器相关的代码片段吗

Java 您能解释一下DriverManager.class中与类加载器相关的代码片段吗,java,jvm,classloader,Java,Jvm,Classloader,以下代码来自java.sql.DriverManager: public static Connection getConnection(String url,String user, String password) { // Gets the classloader of the code that called this method, may // be null. ClassLoader callerCL = DriverManager.getCalle

以下代码来自
java.sql.DriverManager

public static Connection getConnection(String url,String user, String password)    {
    // Gets the classloader of the code that called this method, may 
    // be null.
    ClassLoader callerCL = DriverManager.getCallerClassLoader();
    return (getConnection(url, info, callerCL));
 }
我的第一个问题是为什么
DriverManager.getCallerClassLoader()的结果值可能为空?我认为调用方类应该是用户自己的类,它通常是AppClassLoader

上述代码的子序列
getConnection(url、info、callerCL)
,方法体包含以下代码片段

if(callerCL == null) {
    callerCL = Thread.currentThread().getContextClassLoader();
}    
Thread.currentThread().getContextClassLoader()的作用是什么?我看了文件,看不懂


谢谢。

要回答您的第一个问题

为什么使用
DriverManager.getCallerClassLoader()的结果值可能为空

这是因为,如果您看到它在类
DriverManager

/* Returns the caller's class loader, or null if none */
    private static native ClassLoader getCallerClassLoader();
它是本机方法,可以返回null值

回答你的第二个问题:

Thread.currentThread().getContextClassLoader()的作用是什么

每个线程都有一个与之关联的类加载器。如果线程是主线程,那么与其关联的类加载器就是系统类加载器

很多时候,一个类加载器创建一个对象,而这个对象可能会被其他类加载器启动的线程使用。因此
getContextClassLoader()
允许您访问类加载器,而不是加载对象的类加载器,并且可以访问线程的类加载器可用的资源

在同一论坛上,就同一主题进行了更多的阐述