能否解释一下与ClassLoader相关的DriverManager.class中的代码片段

时间:2012-11-09 12:13:59

标签: 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.getCallerClassLoader();
    return (getConnection(url, info, callerCL));
 }

我的第一个问题是为什么DriverManager.getCallerClassLoader();的结果值可能为空?我认为调用者类应该是用户自己的类,通常是 AppClassLoader

上述代码getConnection(url, info, callerCL)的子序列,方法正文包含以下代码段。

if(callerCL == null) {
    callerCL = Thread.currentThread().getContextClassLoader();
}    

Thread.currentThread().getContextClassLoader()的内容是什么?我已阅读了该文件,无法理解。

感谢。

1 个答案:

答案 0 :(得分:0)

回答你的第一个问题,

为什么DriverManager.getCallerClassLoader();的结果值可能为空?

因为,如果你看到它在班级DriverManager

中定义的方式
/* Returns the caller's class loader, or null if none */
    private static native ClassLoader getCallerClassLoader();

它的本机方法和null值可以返回。

回答你的第二个问题:

Thread.currentThread().getContextClassLoader()的内容是什么?

每个帖子都有一个与之关联的类加载器。如果线程是主线程,则与之关联的类加载器为System Class Loader。

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

Here is another thread在同一个论坛上详细阐述了同一主题。